Python 多进程池,等待进程并重启自定义进程

8 投票
1 回答
14266 浏览
提问于 2025-04-16 03:57

我使用了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

为什么join不起作用?那等待所有进程的正确方法是什么呢?

我的第二个问题是,如何在进程池中重启某个特定的进程?我需要这样做是因为内存泄漏的问题。现在实际上我是在所有进程完成任务后,重建整个进程池(也就是创建一个新的对象池来重启进程)。

我想要的效果是:比如我有4个进程在池中。然后每个进程获取到它的任务,任务完成后,我需要结束这个进程并启动一个新的(以刷新内存泄漏)。

1 个回答

20

你遇到这个错误是因为在调用 pool.join() 之前,你需要先调用 pool.close()

我不知道有什么好的方法来关闭通过 apply_async 启动的进程,但你可以试试正确关闭池子,看看是否能解决你的内存泄漏问题。

我这么认为的原因是,Pool 类有很多属性,这些属性是以守护线程的方式运行的。所有这些线程都需要通过 join 方法来清理。如果你现在的代码没有清理这些线程,那么如果你创建一个新的 Pool,之前的那些线程仍然会在运行。

撰写回答