ホームページ  >  記事  >  バックエンド開発  >  Python gevent実装メカニズム

Python gevent実装メカニズム

巴扎黑
巴扎黑オリジナル
2016-12-09 14:38:401310ブラウズ

前に見たグリーンレットは基本的なコルーチン機能を提供するだけであり、最小の実行単位です。しかし、それを使用したい場合は、どのグリーンレットをいつ実行するかをスケジュールするスケジューラーも提供する必要があります。現在、安定版は 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])

gevent は、スポーンを通じてグリーンレットを作成して開始します。また、グリーンレット実行関数も同様です。これは、このグリーンレットを libev の prepare コールバックに追加することで行われます。Libev は、イベント ループが実行されるたびに、prepare コールバックの関数を呼び出し、実行後に内部のコールバックをクリアします。

このグリーンレットが urlopen と read を実行するとき、gevent は関連するモンキー パッチを呼び出すときにこれらの関数をカプセル化します。操作中に、fd に対応するウォッチャーが作成され、libev のイベント リストに追加されます。関連する読み取りおよび書き込みイベントが発生すると、対応するコールバックがトリガーされ、コルーチンを切り替えます。
上記の方法で、greenlet はスケジューラの目的を達成します。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。