我需要制作一些脚本,它在某些条件下产生并行处理(worker)并使它做一些IO工作。完成后 - 关闭该过程。 但看起来默认情况下流程不会退出。
这是我的方法:
import multiprocessing
pool = multiprocessing.Pool(4)
def f(x):
sleep(10)
print(x)
return True
r = pool.map_async(f, [1,2,3,4,5,6,7,8,9,10])
但是我在ipython中运行它并且为所有打印输出,之后我可以运行ps aux | grep ipython并看到很多进程。看起来这些工人还活着。
也许我做错了什么,但是如何在完成任务后让这些进程终止?如果我想逐个产生很多工作者(例如通过获取一些rmq消息),我应该使用什么方法?
答案 0 :(得分:1)
池声明池时会生成工作进程。在游泳池关闭之前,他们不会被杀死。相反,他们在那里等待更多的工作出现在队列中。
如果您将代码更改为:
r = pool.map_async(f, [1,2,3,4,5,6,7,8,9,10])
pool.close()
pool.join()
print "check ps ax now"
sleep (10)
您将看到池进程已消失。
另一方面,在您声明池后声明函数f时,您的程序可能无法正常工作。我不得不更改pool = multiprocessing.Pool(4)以遵循函数f声明,但这可能因Python版本而异。无论如何,如果你得到奇怪的“模块没有属性”-exceptions,这就是原因。
哈努哈利