сбой многопроцессорной обработки внутри async в python 3.8 (не удается удалить локальный объект)

#python #multiprocessing #python-asyncio #python-3.8

#python #многопроцессорная обработка #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:

Я только что понял, что это не имеет ничего общего с асинхронностью. Он также завершается с ошибкой без асинхронности. Исправление заключалось в перемещении 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())
  

Комментарии:

1. Я думаю, что более простое и понятное решение — сделать это классом?

2. @jacobgalam Python — это не Java, использовать автономные функции вполне нормально. Проблема с исходным кодом заключалась в том, что функция была определена локально, поэтому ее нельзя было перенести в подпроцесс.