我使用了python多处理,并使用以下代码等待所有进程:
...
results = []
for i in range(num_extract):
url = queue.get(timeout=5)
try:
print "START PROCESS!"
result = pool.apply_async(process, [host,url],callback=callback)
results.append(result)
except Exception,e:
continue
for r in results:
r.get(timeout=7)
...
我尝试使用pool.join但得到错误:
Traceback (most recent call last):
File "C:\workspace\sdl\lxchg\walker4.py", line 163, in <module>
pool.join()
File "C:\Python25\Lib\site-packages\multiprocessing\pool.py", line 338, in joi
n
assert self._state in (CLOSE, TERMINATE)
AssertionError
为什么加入不合作?什么是等待所有流程的好方法。
我的第二个问题是如何重新启动池中的某个进程?我在内存泄漏的原因需要这个。现在实际上我在所有进程完成任务后重建所有池(创建新的对象池来重新启动进程)。
我需要什么:例如我在游泳池中有4个进程。然后进程得到他的任务,任务完成后我需要杀死进程并启动新的(刷新内存泄漏)。
答案 0 :(得分:19)
您收到错误是因为在致电pool.close()
pool.join()
我不知道关闭以apply_async
开始的进程的好方法,但是看看正确关闭池是否会导致内存泄漏消失。
我认为这是因为Pool
类有一堆属性是以守护进程模式运行的线程。所有这些线程都通过join
方法进行清理。你现在拥有的代码不会清理它们,所以如果你创建一个新的Pool
,你仍然可以从最后一个运行所有这些线程。