1

Tornado와 asyncio를 사용하여 비동기 프로그램을 작성했지만, 비동기식 작업이 완료되었다는 것을 이해하지 못한다는 것을 깨달았습니다.비동기 작업은 스레드가 하나라도 있으면 "완료"한다고 어떻게 말합니까?

예를 들어 http://www.tornadoweb.org/en/stable/guide/async.html#examples의 비동기 가져 오기를 살펴 보겠습니다.

나의 이해는 지금까지입니다 : fetchFuture를 산출 할 때

  1. 핸들러가 일시 중단됩니다.
  2. Futurehttp://www.tornadoweb.org/en/stable/ioloop.html#tornado.ioloop.IOLoop.add_future
  3. Future 완료 통해 IOLoop에 첨가하고, 코 루틴이 움직이게 될 IOLoop 일정하므로 완료 할 수있다.

3 단계의 Future이 어떻게 완료되고 "done callback"이 호출되는지 이해할 수 없습니다. 스레드가 하나만 있다고 생각했기 때문에 Future은 "백그라운드에서 작동"하고 컨트롤을 통해 콜백을 호출 할 수 있습니까?

답변

2

IOLoop은 가져 오는 원격 서버에 대한 소켓을 열고 epoll 또는 유사한 시스템 호출을 사용하여 IO를 기다리는 파일 설명자 목록에 해당 소켓을 추가합니다.

루프가 코드를 실행하지 때마다 - 당신의 핸들러가 yield 일시 정지 할 때, 예를 들어, 루프, 여기 IO를 기다리는 : https://github.com/tornadoweb/tornado/blob/master/tornado/ioloop.py#L862

그것이 IO 이벤트를 수신

- 예를 들어 원격 서버가 응답 바이트를 보내는 경우 - Tornado는 해당 이벤트를 기다리고있는 콜백을 찾아 실행합니다.

이벤트 루프 구현의 예는 A Web Crawler With asyncio Coroutines을 참조하십시오.