4

每当我调用函数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)

类似的东西。

4

1 回答 1

3

问题是您没有调用返回的 by get(),也没有使用/等到子进程完成工作后再退出主进程。由于 a 内的所有工作进程都是守护进程,因此它们会在主进程退出后立即终止。这意味着您的示例程序在子进程可以打印任何内容之前退出(并带走它的子进程)。您可以通过调用或添加/调用来修复它:AsyncResultapply_asyncpool.closepool.join()Pool.get()AsyncResultclose()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
于 2014-10-15T20:12:10.017 回答