2016-12-21 3 views
1

현재 파이썬 3.5 이상에서이 문제에 접근하는 방법에 어려움을 겪고 있습니다. 멀티 프로세싱, 멀티 스레딩 또는 asyncio이

while True: 
    do_process1() # run this synchronously 
    do_process2() # don't wait on this to go to the next iteration but need to handle its completion 

그리고이 경우에

do_process2() 시간이 오래 걸리는 :

나는 다음과 같다 코드가 있습니다. do_process2()을 비동기 적으로 실행하여 루프의 다음 반복이 do_process2()에서 완료 될 때까지 기다리지 않도록합니다.

내가 읽고있는 것으로부터 멀티 스레딩을 사용할 수는 있지만 GIL을 사용하면 어떻게하면 "offload"do_process2() 수 있고 다음 반복 실행을 볼 수는 없습니다.

여기서는 멀티 프로세싱이 적합 할 것으로 보입니다. 그 말을 듣고, 많은 예제들이 나와 있습니다. 은 서브 프로세스에서을 기다려야 작업을 마칠 수 있습니다. 나는 그것을하고 싶지 않다. 나는 계속 while 루프를 실행하고 싶다.

마찬가지로, 비동기 호출 do_process2()에서 콜백을 처리하여 해당 작업의 완료를 처리 할 수 ​​있기를 원합니다. 나는 그걸 apply_async()에있는 Pool 객체로 처리 할 수 ​​있다는 것을 알았지 만, 그게 가장 좋은 접근법인가?

가장 좋은 방법은 무엇입니까? 파이썬 3.5 이상을 사용하고 있습니다. 그래서 asyncio가이 모든 것에 적합 할까? 멀티 스레딩처럼 생각합니다. 나는 오프로드 및 계속 작업을 찾고 싶지 않을 것입니다.

답변

0

정확히 어떤 일 이냐에 따라 do_process2, multiprocessing은 항상 안전한 선택입니다 (CPython은 스레드와 GIL에 대해 몇 가지 문서화 된 문제가 있기 때문에 항상 그렇습니다) 마지막으로이 종류의 시원 인 asyncio있어하지만 통지

을 말한다대로 asyncio 패키지에 포함 된 (그래서 휴대 나를 위해 거래 차단기는 내가 Windows에서 파이썬 코드를 많이 실행) 이동성 문제가 표준 라이브러리를 제공합니다. 핵심 개발자가 필요하다고 판단 할 경우 이전 버전과 호환되지 않는 변경 사항 (모듈 제거까지 포함)이 발생할 수 있습니다.

+0

감사합니다. 그렇다면 파이썬의 멀티 스레딩 부분에 대한 asyncio의 기능은 무엇입니까? 그것은 또 다른 방법일까요? – user7327326

관련 문제