前に見たグリーンレットは基本的なコルーチン機能を提供するだけであり、最小の実行単位です。しかし、それを使用したい場合は、どのグリーンレットをいつ実行するかをスケジュールするスケジューラーも提供する必要があります。現在、安定版は libev.libevent の代替を使用しています。libev は多くのイベント タイプをサポートしていますが、最も一般的に使用されているのは io タイプとタイマー タイプです。システム (Linux では epoll) によって提供されるタイマー タイプは、最小限のヒープを維持することによって実装されます。
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])gevent は、スポーンを通じてグリーンレットを作成して開始します。また、グリーンレット実行関数も同様です。これは、このグリーンレットを libev の prepare コールバックに追加することで行われます。Libev は、イベント ループが実行されるたびに、prepare コールバックの関数を呼び出し、実行後に内部のコールバックをクリアします。
このグリーンレットが urlopen と read を実行するとき、gevent は関連するモンキー パッチを呼び出すときにこれらの関数をカプセル化します。操作中に、fd に対応するウォッチャーが作成され、libev のイベント リストに追加されます。関連する読み取りおよび書き込みイベントが発生すると、対応するコールバックがトリガーされ、コルーチンを切り替えます。
上記の方法で、greenlet はスケジューラの目的を達成します。