나는 다음과 같은 논리를 갖는 애완 동물 프로젝트가 있습니다. 하지만 제가이해야 할 것은 대신 start()
코 루틴하게하는 것입니다 : 여기 asyncio + 멀티 + 유닉스
asyncio.get_event_loop().run_until_complete(start())
문제입니다 :
async def start():
multiprocessing.Process(target=sub_loop).start()
그것을 실행하기를, 내가 그런 일을해야 할 하위 프로세스가 생성 될 때, 이 복제 된 전체 파이썬 환경을 얻는다, 그래서 이벤트 루프가 이미 실행 중입니다
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 : 여기 전체 실패 코드입니다. 당신은 항상 당신이 코드를합니다 (if __name__ == '__main__':
부분을 실행하는 방법을 확인하기 위해 검사를 추가해야
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())
I 전체 응답 시간이 없어,하지만 (a)받은 멀티 물건이 어디 당신이 디자인을 고려할 수 있습니다 eg를 사용하여 호출 할 수있는 스크립트로 수행됩니다. '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