gpt4 book ai didi

python多处理僵尸进程

转载 作者:太空宇宙 更新时间:2023-11-04 03:31:52 31 4
gpt4 key购买 nike

我有一个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 个进程。

我读到,为了避免应该绑定(bind)(加入)父进程的僵尸进程,这是我希望在第二个循环中实现的。但问题是,在启动时它会产生 40 个进程,worker 完成处理并进入僵尸状态,直到所有当前产生的进程都没有完成,然后在“while True”的下一次迭代中,相同的模式继续。

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

最佳答案

对于像您所描述的那样的任务,通常最好使用使用 Pool 的不同方法。

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

以下来自 Python DocsPool 示例

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 而不是 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多处理僵尸进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30845727/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com