是否可以将可调用对象应用于进程池?

时间:2014-10-15 20:04:00

标签: python multiprocessing python-multiprocessing

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

类似的东西。

1 个答案:

答案 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