python 3.8中异步内部的多处理失败(无法腌制本地对象)

时间:2020-09-25 09:32:40

标签: python multiprocessing python-asyncio python-3.8

以下代码在python 3.7中有效,但在python 3.8(AttributeError: Can't pickle local object 'main.<locals>.f')中无效

import multiprocessing as mp
import asyncio

async def main():
    def f():
        print("hello")

    p = mp.Process(target=f)
    p.start()

if __name__ == "__main__":
    asyncio.run(main())

我知道在异步函数中运行进程并不常见,可能会引起一些麻烦,但我发现有时它很有用。它在python 3.8中不再起作用的原因是什么?有没有一种方法可以更新代码以使其正常工作?

1 个答案:

答案 0 :(得分:2)

我刚刚意识到这与异步无关。如果没有异步,它也会失败。解决方法是将f移到main之外。不确定为什么python 3.8现在需要这样做。

import multiprocessing as mp
import asyncio

def f():
    print("hello")

async def main():
    p = mp.Process(target=f)
    p.start()

if __name__ == "__main__":
    asyncio.run(main())