Вызвать асинхронный метод обьекта через multiprocessing

  1. Есть асинхронный метод обьекта, пытаюсь его вызвать через multiprocessing.Process перед этим обернув в asyncio.run, это срабатывает, но процесс блокируется и невозможно запустить несколько процессов параллельно, приходится ждать завершения текущего.

  1. Далее я перешел к другому решению и создал у класса новый не асинхронный метод внутри которого происходил вызов асинхронного метода этого же класса через asyncio.run. Это работает но процесс попрежнему блокируется как и в первом случае.

  1. Создал функцию из которой вызвал не асинхронный метод внутри которого происходил вызов асинхронного метода этого же класса через asyncio.run. Это работает прекрасно в многопотоке. Но проблема что предтся создавать функцию для каждого обьекта. В аргументах multiprocessing.Process нельзя передать обьект. Метод кривой но каким то образом работает.

  1. Так же я пробовал передавать обьекты аргументами в функцию через multiprocessing.Pool это не работало когда в аргументах обьект.

Я исчерпал все методы и не знаю как решить эту проблему...

Python 3.8

P.S. Забыл отписать что у меня все работало через ThreadPool, но асинхронное выполнение двух задач было медленным. Асихронность досталась от библиотеки puppeteer нет возможности использовать ее синхронную версию, так как ее просто нет.


Ответы (2 шт):

Автор решения: eri

asyncio.run это почти синглтон, который работает один раз. Для запуска асинхронщины в попроцесса используйте loop = asyncio.new_event_loop(); loop.run_until_complete(async_foo()) внутри процесса. Но...

Мультипроцессинг и методы класса не совместимые понятия потому как класс не передается в процесс, а только копируется при старте процесса.

Для запуска синхронной тяжелой работы в асинхронном приложении существуют экзекуторы, а асинхронные функции вполне работают в тасках.

→ Ссылка
Автор решения: bro

Разобрался, суть в том что multiprocessing использует pickle для сериализации обьектов, и он скорее всего неправильно обрабатывает обьект класса. Как замену стандартному multiprocessing использовал pathos. Он использует dill для сериализации обьектов, обработает все типы что ему скормите.

→ Ссылка