每当我调用函数Pool.apply_async
时,我都必须传递一个函数来运行该进程。我试图传递一个可调用的对象,但它没有做任何事情。有什么办法吗?或者我是否必须自己设计游泳池?
代码如下:
import queue
class TaskThread(object):
def __init__(self):
#self.queue=queue.Queue()
def __call__(self):
print("in TaskThread.__call__")
#self.queue.put(1)
pool=multiprocessing.Pool(4)
task=TaskThread()
pool.apply_async(target=task)
类似的东西。
答案 0 :(得分:3)
问题是您没有在get()
返回的AsyncResult
上致电apply_async
,也没有使用pool.close
/ pool.join()
来等到子进程在退出主进程之前完成工作。由于Pool
内的所有工作进程都是守护进程,因此只要主进程退出就会终止它们。这意味着您的示例程序在子进程可以打印出任何内容之前退出(并带着它的子代)。您可以通过致电.get()
上的AsyncResult
或添加close()
/ join()
来电来解决问题:
class TaskThread(object):
def __call__(self):
print("in TaskThread.__call__")
pool=multiprocessing.Pool(4)
task=TaskThread()
pool.apply_async(task)
pool.close()
pool.join()
或者:
class TaskThread(object):
def __call__(self):
print("in TaskThread.__call__")
pool=multiprocessing.Pool(4)
task=TaskThread()
result = pool.apply_async(task)
result.get()
修改强>
为了按照您尝试的方式传递Queue
,您需要执行以下操作:
import multiprocessing
class TaskThread(object):
def __init__(self, manager):
self.queue = manager.Queue()
def __call__(self):
print("in TaskThread.__call__")
self.queue.put(1)
if __name__ == "__main__":
pool=multiprocessing.Pool(4)
m = multiprocessing.Manager()
task=TaskThread(m)
result = pool.apply_async(task)
result.get()
print(task.queue.get())
输出:
in TaskThread.__call__
1