python多处理僵尸进程

时间:2015-06-15 12:54:54

标签: python multiprocessing zombie-process

我有一个简单的python多处理模块实现

if __name__ == '__main__':
jobs = []

while True:
    for i in range(40):
        # fetch one by one from redis queue
        #item = item from redis queue
        p = Process(name='worker '+str(i), target=worker, args=(item,))

        # if p is not running, start p
        if not p.is_alive():
            jobs.append(p)
            p.start()

    for j in jobs:
        j.join()
        jobs.remove(j)


def worker(url_data):
    """worker function"""
    print url_data['link']

我希望此代码能够做到:

  1. 在无限循环中运行,继续等待Redis队列。
  2. 如果Redis队列不为空,则获取项目。
  3. 创建40个multiprocess.Process,而不是更多
  4. 如果进程已完成处理,则启动新进程,以便~40进程始终在运行。
  5. 我读到这一点,以避免应该绑定(加入)父节点的僵尸进程,这是我期望在第二个循环中实现的。但问题是,在启动它时会产生40个进程,工作人员完成处理并进入僵尸状态,直到所有当前生成的进程尚未完成, 然后在"而True"的下一次迭代中,相同的模式继续。

    所以我的问题是: 我怎样才能避免僵尸进程。并在40中完成后立即生成新进程

1 个答案:

答案 0 :(得分:2)

对于您所描述的任务,通常最好使用this.state.isSelected使用不同的方法。

您可以让主进程获取数据,工作人员可以处理它。

来自Python Docs

var React = require('react'); var SelectBox = require('./select-box'); var ListItem = React.createClass({ getInitialState: function() { return { isSelected: false }; }, toggleSelected: function () { if (this.state.isSelected == true) { this.setState({ isSelected: false }) } else { this.setState({ isSelected: true }) } }, handleClick: function(listItem) { this.toggleSelected(); this.props.onListItemChange(listItem.props.value); var unboundForEach = Array.prototype.forEach, forEach = Function.prototype.call.bind(unboundForEach); forEach(document.querySelectorAll('ul.cs-select li'), function (el) { // below is trying to // make sure that when a user clicks on a list // item in the SelectableList, then all the *other* // list items get class="selected" removed. // this works for the first time that you move through the // list clicking the other items, but then, on the second // pass through, starts to fail, requiring *two clicks* before the // list item is selected again. // maybe there's a better more "reactive" method of doing this? if (el.dataset.index != listItem.props.index && el.classList.contains('selected') ) { el.classList.remove('selected'); } }); }, render: function() { return ( <li ref={"listSel"+this.props.key} data-value={this.props.value} data-index={this.props.index} className={this.state.isSelected == true ? 'selected' : '' } onClick={this.handleClick.bind(null, this)}> {this.props.content} </li> ); } }); var SelectableList = React.createClass({ render: function() { var listItems = this.props.options.map(function(opt, index) { return <ListItem key={index} index={index} value={opt.value} content={opt.label} onListItemChange={this.props.onListItemChange.bind(null, index)} />; }, this); return <ul className="cs-select">{ listItems }</ul>; } }) var CustomSelect = React.createClass({ getInitialState: function () { return { selectedOption: '' } }, handleListItemChange: function(listIndex, listItem) { this.setState({ selectedOption: listItem.props.value }) }, render: function () { var options = [{value:"One", label: "One"},{value:"Two", label: "Two"},{value:"Three", label: "Three"}]; return ( <div className="group"> <div className="cs-select"> <SelectableList options={options} onListItemChange={this.handleListItemChange} /> <SelectBox className="cs-select" initialValue={this.state.selectedOption} fieldName="custom-select" options={options}/> </div> </div> ) } }) module.exports = CustomSelect; 示例
Pool

我还建议您使用Pool代替def f(x): return x*x if __name__ == '__main__': pool = Pool(processes=4) # start 4 worker processes result = pool.apply_async(f, [10]) # evaluate "f(10)" asynchronously print result.get(timeout=1) # prints "100" unless your computer is *very* slow print pool.map(f, range(10)) # prints "[0, 1, 4,..., 81]" ,因为您的任务似乎是异步。

你的代码大概是:

imap