У меня есть любимый проект со следующей логикой:asyncio + многопроцессорная + Unix
import asyncio, multiprocessing
async def sub_main():
print('Hello from subprocess')
def sub_loop():
asyncio.get_event_loop().run_until_complete(sub_main())
def start():
multiprocessing.Process(target=sub_loop).start()
start()
Если вы запустите ее, вы увидите:
Hello from subprocess
Это хорошо. Но то, что я должен сделать, это сделать start()
сопрограмму вместо:
async def start():
multiprocessing.Process(target=sub_loop).start()
Чтобы запустить его, я должен сделать что-то вроде этого:
asyncio.get_event_loop().run_until_complete(start())
Вот вопрос: когда процесс суб- создается, он получает все окружение Python клонированный, поэтому цикл событий уже работает там:
Process Process-1:
Traceback (most recent call last):
File "/usr/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap
self.run()
File "/usr/lib/python3.5/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "test.py", line 7, in sub_loop
asyncio.get_event_loop().run_until_complete(sub_main())
File "/usr/lib/python3.5/asyncio/base_events.py", line 361, in run_until_complete
self.run_forever()
File "/usr/lib/python3.5/asyncio/base_events.py", line 326, in run_forever
raise RuntimeError('Event loop is running.')
RuntimeError: Event loop is running.
Я пытался уничтожить его на подпроцесс стороне не повезло, но я думаю, что правильный путь к пр однако его совместное использование с подпроцессом. Возможно ли это как-то?
UPDATE: Вот полный код недостатка:.
import asyncio, multiprocessing
import asyncio.unix_events
async def sub_main():
print('Hello from subprocess')
def sub_loop():
asyncio.get_event_loop().run_until_complete(sub_main())
async def start():
multiprocessing.Process(target=sub_loop).start()
asyncio.get_event_loop().run_until_complete(start())
У меня нет времени для полного ответа, но вы можете рассмотреть конструкцию, где (а) ваша многопроцессорная материал выполняемый скриптом, который может быть вызван, например, с помощью. 'subprocess.Popen ([sys.executable," the_script.py "], ...)' (b) этот сценарий связывается со своим родителем, например. 'stdout', используя разработанный протокол (он может быть абсолютно простым, например, однобайтные управляющие символы для сценариев и обновлений состояния) и (c) с помощью API-интерфейса подпроцесса [asyncio] (https://docs.python.org/ 3/библиотека/asyncio-subprocess.html). – detly
(я не имею в виду, что вы должны одновременно использовать подпроцесс subprocess.Popen и API-интерфейс подпроцесса asyncio, просто чтобы вы могли написать свой скрипт, чтобы он * можно было контролировать * как любой язык-агностический подпроцесс.) – detly
@detly Спасибо за предложение, но есть много данных, которые должны быть унаследованы подпроцессом. Если есть простое решение, чтобы избежать упомянутой проблемы, я предпочел бы ее, а не переписывать все многопроцессорные материалы вручную. – Grief