每当我调用函数 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)
类似的东西。
最佳答案
问题是你没有在apply_async
返回的AsyncResult
上调用get()
,也没有使用 pool.close
/pool.join()
在退出主进程之前等待子进程完成工作。由于 Pool
内的所有工作进程都是守护进程,它们会在主进程退出后立即终止。这意味着您的示例程序在子进程可以打印出任何内容之前退出(并带走它的子程序)。您可以通过在 AsyncResult
上调用 .get()
或添加 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
关于python - 是否可以将可调用对象应用于进程池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26391117/