Python 多处理池,带有;应用“异步”;如果从函数内部执行,则不执行任何操作

Python 多处理池,带有;应用“异步”;如果从函数内部执行,则不执行任何操作,python,python-3.x,asynchronous,multiprocessing,python-multiprocessing,Python,Python 3.x,Asynchronous,Multiprocessing,Python Multiprocessing,我正在尝试使用模块,更多的是使用函数 此代码运行良好: 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”字符串打印两次 但是,如果我把这段代码放在一

我正在尝试使用模块,更多的是使用函数

此代码运行良好:

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。

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

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()
你会明白为什么“什么都没发生”

回溯(最近一次呼叫最后一次):
文件“/tmp/test.py”,第17行,在
测试()
文件“/tmp/test.py”,测试中的第12行
result.get()
get中第608行的文件“/usr/lib/python3.5/multiprocessing/pool.py”
提升自我价值
文件“/usr/lib/python3.5/multiprocessing/pool.py”,第385行,在任务处理中
放置(任务)
文件“/usr/lib/python3.5/multiprocessing/connection.py”,第206行,在send中
self.\u发送字节(ForkingPickler.dumps(obj))
文件“/usr/lib/python3.5/multiprocessing/reduce.py”,第50行,转储
cls(buf,协议).dump(obj)
AttributeError:无法pickle本地对象“test..do”
Python
multiprocessing.Pool
依赖于
pickle
协议来序列化要发送到另一个进程的数据。
pickle
协议只能序列化顶级函数,不能序列化嵌套函数


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

Thansk!但是,如果我不调用
get()
,为什么它会悄无声息地失败呢?因为您并不是在声明结果,它只会忽略它。原因可能是,无论成功与否,您都希望异步执行某些内容。您还可以检查
concurrent.futures
模块,该模块具有类似但更清晰的API。作为用户,我希望收到酸洗过程失败的通知,因为这不是我实际功能的一部分。但是这没关系,谢谢你的解释。通常异步调用不会引起设计上的副作用。原因是异步调用不应影响应用程序的执行流。开发人员有责任决定是否检查异步执行的作业的结果。如果您不想阻止线程等待结果,您可以始终使用回调函数记录提交作业的结果/异常。
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'