앞서 살펴본 그린렛은 코루틴의 기본 기능만을 제공하며 가장 작은 실행 단위입니다. 하지만 이를 사용하려면 어떤 그린렛이 언제 실행되어야 하는지 스케줄링하는 스케줄러를 제공해야 합니다. gevent 구현을 보면 현재 안정 버전은 libev.libevent에 대한 대안을 사용합니다. libev는 많은 이벤트 유형을 지원하지만 가장 일반적으로 사용되는 유형은 io 및 타이머 유형입니다. 시스템에서 제공하는 호출(Linux에서는 epoll), 타이머 유형은 최소 힙을 유지하여 구현됩니다.
다음 코드를 보세요:
Python 코드
import gevent from gevent import monkey monkey.patch_all() def download(): import urllib2 urllib2.urlopen('http://www.google.com/').read() c = gevent.spawn(download) gevent.joinall([c])
spawn을 통한 gevent 그린렛의 실행 기능은 다운로드입니다. 이 그린렛을 시작하려면 libev가 이벤트 루프를 실행할 때마다 이 그린렛을 추가합니다. 실행 후 준비 콜백의 함수가 호출됩니다. 이렇게 하면 생성된 각 greenlet이 실행될 수 있습니다.
이 greenlet이 실행될 때. io 작업(socket.[send|recv ])이 포함되므로 gevent는 해당 작업이 호출되면 fd에 해당하는 watcher가 생성되어 libev의 이벤트 목록에 추가됩니다.
관련 읽기 및 쓰기 이벤트가 발생하면 해당 콜백이 greenlet의 스위치를 호출하여 코루틴을 전환합니다.
위 방법을 통해 greenlet은 스케줄러의 목적을 달성합니다. >