#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, использовать автономные функции вполне нормально. Проблема с исходным кодом заключалась в том, что функция была определена локально, поэтому ее нельзя было перенести в подпроцесс.