は、私は次のロジックを持つペットのプロジェクトを持っています。しかし、私がしなければならない代わりにstart()
コルーチンようにすることです。それを実行するにはasyncio +マルチプロセッシング+ UNIX
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.
私は運とサブプロセス側でそれを破壊しようとしたが、私は正しい方法でのPRであることを考えますイベントをサブプロセスと共有します。どういうわけか可能ですか?
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())
:あなたの問題については、新しいループを設定するevent loop policy機能を使用することができます例えば、スクリプトを使用して呼び出すことができます。 'subprocess.Popen([sys.executable、the_script.py"]、...) '(b)このスクリプトは、例えばその親と通信します。 (例えば、スクリプトやステータスの更新には完全に単純な制御文字を使用することができます)、(c)[asyncio subprocess API](https://docs.python.org/)を使用して、 'stdout' 3/library/asyncio-subprocess.html)。 – detly
( 'subprocess.Popen'とasyncioのサブプロセスAPIを同時に使うべきではありません。あなたがスクリプトを記述して言語に依存しないサブプロセスとして制御できるようにするだけです) – detly
@detly提案していただきありがとうございますが、サブプロセスによって継承されるべきデータがたくさんあります。上記の問題を回避する簡単な解決策がある場合は、すべてのマルチプロセッシングを手作業で書き直すのではなく、それを好むでしょう。 – Grief