python多处理池,等待进程并重启自定义进程
Posted
技术标签:
【中文标题】python多处理池,等待进程并重启自定义进程【英文标题】:python multiprocessing pool, wait for processes and restart custom processes 【发布时间】:2011-04-10 14:16:40 【问题描述】:我使用 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 个进程。然后进程得到他的任务,任务完成后我需要杀死进程并开始新的(刷新内存泄漏)。
【问题讨论】:
为什么multiprocessing/pool.py
住在site-packages
而不是直接住在Lib
?如果你一直在破解它,那么我们需要知道。
hmm.. 我不知道我用 Windows 安装程序安装它...从官方网站获得..
【参考方案1】:
您收到错误是因为您需要在调用 pool.join()
之前调用 pool.close()
我不知道关闭以apply_async
开头的进程的好方法,但看看正确关闭池是否不会让您的内存泄漏消失。
我认为这是因为Pool
类有一堆属性,这些属性是在守护进程模式下运行的线程。所有这些线程都由join
方法清理。您现在拥有的代码不会清理它们,因此如果您创建一个新的Pool
,您仍然会拥有从上一个线程运行的所有线程。
【讨论】:
关于池我的意思是池使用进程似乎在开始到结束时创建。我的脚本长时间工作并且随着时间的推移池的所有进程开始在内存中增长,我想不时重置进程的内存使用量(进程的每个新任务)并且重新启动进程是我可以做到的一种方法。 . 我认为 对不起,我的意思不是内存泄漏,我的意思是简单的进程内存增长并通过进程重启来控制这种增长。 @Evg。如果新进程可以完成与旧进程相同的任务但内存较少,那么看起来您在进程本身而不是池中存在内存泄漏。那是一个单独的问题。简而言之,您需要检查是否在流程中创建了任何循环。如果是这样,请确保在处理完循环成员后del
循环成员,以便垃圾收集器可以回收空间。
是的,它在 apply_async 中传递的进程中,从 web 获取数据的进程它需要每个任务不同的内存,这就是为什么我需要为每个任务创建新进程(在池中重新创建进程)(太空闲了 memore从上一个任务消耗)。我认为 gc 在这里没有帮助,我尝试以一种方式使用它 - 没有帮助,需要更全局的东西,例如重新创建所有任务流程。
换句话说,我的池以 4 个进程开始,每个进程在开始时消耗了接近 2 mb 的内存。在每个进程执行 thausend 的任务后,它会增长到 100mb。这就是为什么我需要为每个新任务重新启动。以上是关于python多处理池,等待进程并重启自定义进程的主要内容,如果未能解决你的问题,请参考以下文章