如果从函数内部执行,带有“ apply_async”的多处理池不执行任何操作

时间:2019-06-09 19:54:32

标签: python python-3.x asynchronous multiprocessing python-multiprocessing

我正在尝试使用multiprocessing模块,更具体地说是使用Pool.apply_async()函数。

此代码运行良好:

import multiprocessing

def do():
    print("Foobar", flush=True)

with multiprocessing.Pool(1) as pool:
    for i in range(2):
        pool.apply_async(do)

    pool.close()
    pool.join()

"Foobar"字符串被打印两次。

但是,如果我将此代码放入一个函数中,然后再调用此函数,则不会发生任何事情。没有错误,也没有"Foobar",程序将以静默方式结束。

import multiprocessing

def test():

    def do():
        print("Foobar", flush=True)

    with multiprocessing.Pool(1) as pool:
        for i in range(5):
            pool.apply_async(do)

        pool.close()
        pool.join()

test()

为什么呢?我在Linux上使用的是Python 3.7.3。

1 个答案:

答案 0 :(得分:1)

为了检索您的计算结果,请对代码进行以下更改。

displaySelectedUser = ({target})

您将看到“什么都没发生”的原因。

import multiprocessing

def test():

    def do():
        print("Foobar", flush=True)

    with multiprocessing.Pool(1) as pool:
        for i in range(5):
            result = pool.apply_async(do)

            result.get()

        pool.close()
        pool.join()

test()

Python Traceback (most recent call last): File "/tmp/test.py", line 17, in <module> test() File "/tmp/test.py", line 12, in test result.get() File "/usr/lib/python3.5/multiprocessing/pool.py", line 608, in get raise self._value File "/usr/lib/python3.5/multiprocessing/pool.py", line 385, in _handle_tasks put(task) File "/usr/lib/python3.5/multiprocessing/connection.py", line 206, in send self._send_bytes(ForkingPickler.dumps(obj)) File "/usr/lib/python3.5/multiprocessing/reduction.py", line 50, in dumps cls(buf, protocol).dump(obj) AttributeError: Can't pickle local object 'test.<locals>.do' 依赖于multiprocessing.Pool协议来序列化要发送到其他进程的数据。 pickle协议只能序列化顶级函数,而不能嵌套。

查看哪些可以腌制,哪些不能检查documentation