2017-05-12 10 views
0

eventlet.tpool이 유용한 것에 대해 이해하려고합니다. 문서에 따르면 tpool.execute()를 사용하면 차단 기능을 사용하여 새 스레드에서 실행할 수 있습니다. 그러나 tpool.execute() 메서드 자체는 스레드가 완료 될 때까지 차단됩니다! 어떻게 유용할까요? myfunc() 함수를 일부 차단/장기 실행하고 직접 호출하면 차단됩니다. tpool.execute (myfunc) 내부에서 호출하면 tpool.execute (myfunc) 호출이 차단됩니다. 차이점은 무엇입니까?이벤트 릿 tpool은 어떻게 유용합니까?

내가 추측 할 수있는 유일한 사실은 myfunc()가 직접 호출 될 때이 coroutine을 차단할뿐만 아니라 다른 coroutines도 실행하지 못하게하는 반면 tpool.execute()를 호출하면 현재의 coroutine을 차단하지만 어떻게 든 생성됩니다. 다른 코 루틴도 실행할 수 있습니다. 이 경우인가요? 그렇지 않으면 tpool이 어떻게 유용 할 수 있는지 알지 못합니다.

답변

1

당신은 직접 답을 썼습니다. 나는 그것을 바꿔 말할 수 있습니다.

Eventlet, Gevent, Twisted, Asyncio 및 기타 협업 멀티 태스킹 라이브러리와 관련하여 모든 것을 차단한다는 의미로 "차단"이라는 용어를 사용합니다. 패치가 적용되지 않은 time.sleep(1)은 호출자 OS 스레드를 차단하고 다른 OS 스레드를 계속 허용하는 OS 스레드 의미와는 반대로 모든 coroutines/greenthreads를 차단합니다.

coroutine/greenthread를 차단하는 것과 OS 스레드를 차단하는 것을 구분하기 위해 을 사용하여 ""을 생성합니다. 항복하는 함수는 나머지 코 루틴을 실행할 수있는 반면, 블로킹 (파이썬 실행 의미로 인해)은 호출자 코 루틴 만 허용합니다.

강력한 전문 용어로 무장 한 tpool.execute()은 차단 호출로 하나의을 생성합니다.

eventlet.spawn(tpool.execute, fun, ...)과 결합하면 발신자 코 루틴도 차단되지 않습니다. 어쩌면 당신은 이것을 도움이되는 조합으로 생각할 것입니다.

패치는 언제나 환영합니다. Eventlet은 많은 훌륭한 사람들의 노력이 결합 된 훌륭한 라이브러리입니다.