python多处理僵尸进程
我有一个python的多处理模块的简单实现python多处理僵尸进程,python,multiprocessing,zombie-process,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 __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']
我希望这段代码能做什么:
如何避免僵尸进程。并在每40个任务中就有1个完成后生成新流程。对于您描述的任务,通常最好使用不同的方法使用
池
您可以让主进程获取数据,由工作人员处理
下面是来自的池的示例
我还建议使用imap
而不是map
,因为您的任务似乎可以是异步的
您的代码大致如下:
p = Pool(40)
while True:
items = items from redis queue
p.imap_unordered(worker, items) #unordered version is faster
def worker(url_data):
"""worker function"""
print url_data['link']
工作非常完美,内存使用量比进程稍高,不过,我对python还是比较陌生的,您确定我应该使用池而不是进程吗?当然,这取决于您的具体任务。一般来说,你把工作推给了一群工人。在工人工作期间,你不需要直接与他们沟通。为此类场景创建了池。:)
p = Pool(40)
while True:
items = items from redis queue
p.imap_unordered(worker, items) #unordered version is faster
def worker(url_data):
"""worker function"""
print url_data['link']