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

标签 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)

类似的东西。

最佳答案

问题是你没有在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/

相关文章:

python - 如何在python中转换以下字符串?

python - 如何在 Python 中对类实例使用多处理?

python-3.x - OpenCV的VideoWriter可以在单独的过程中编写吗?

python - 在进程之间共享 numpy 和 scipy 对象

javascript - Python toDataUrl 等效项

Python (pdb) - 排队执行命令

c++ - 在 24 核 CPU 中增加线程数超过 4 会导致性能下降

python - Python 多处理模块的 .join() 方法到底在做什么?

python - 用于加密多个文件的多线程或多处理

python - 如何在 Python 3.6 中隐藏 input()?