geventについてのまとめ
0 x 00基本概念
geventはlibevとgreenletに基づくpython非同期フレームワークである.
libevは高性能なイベントループ(event loop)実装である.イベントループ(IO多重化とも呼ばれる)は,ブロック問題を解決し,同時化を実現する方法である.簡単に言えば、
0 x 01 Actorモード
このように、この
0 x 02コールバックを実現
また、
やはりその言葉ですが、このようなデザインは、余っているように見えるかもしれません.しかし、フレームワークの機能が増加するにつれて、このような余分な設計はあなたのコードをますます柔軟にします.
geventはlibevとgreenletに基づくpython非同期フレームワークである.
libevは高性能なイベントループ(event loop)実装である.イベントループ(IO多重化とも呼ばれる)は,ブロック問題を解決し,同時化を実現する方法である.簡単に言えば、
event loop
はio
イベントの変化をキャプチャし、処理します.ブロックに遭遇すると、飛び出します.ブロックが終わったら、続けます.これは、システムの最下位レベルのselect
関数およびそのアップグレード版:poll
およびepoll
に依存する.「コンピュータシステムを深く理解する」という本では、これについて深く検討している.greenlet
はpython
の連携管理・切替モジュールである.greenlet
を使用すると、異なるタスク間を明示的に切り替えることができます.0 x 01 Actorモード
Actor
はErlang
言語の真髄である.メッセージングベースの同時メカニズムを強調します.この文章を模倣してactorモデルを構築した.コアコードは次のとおりです.import genvet
#
queue = gevent.queue.JoinableQueue()
while True:
#
try:
data = queue.get(timeout=5)
except Empty:
gevent.sleep(0.5)
continue
# Actor
if data:
gl = Actor(data)
g1.start()
g1.join()
Actor
は、私たちがカスタマイズしたGreenlet
のサブクラスです.コアコードは次のとおりです.class Actor(Greenlet):
def __init__(self, data):
self.data = data
Greenlet.__init__(self)
def _run(self):
result = do_something(self.data)
return result
このように、この
Actor
は、start()
を介して_run()
が呼び出されるメッセージキューからデータを受信することができる.gevent
とmonkey patch
の存在により、非同期のコードを同期して書くことができます.このような書き方は多く余っているように見える.しかし、ビジネスの分離をうまく実現し、コードをより明確にし、メンテナンスと拡張を容易にすることができます.0 x 02コールバックを実現
また、
Actor
にコールバックを追加したい場合は、彼が完成してから、いくつかの処理を行います.では、Actor
の機種を以下のように変更することができます.class Actor(Greenlet):
def __init__(self, data):
self.data = data
Greenlet.__init__(self)
def _run(self):
# self.link 。
self.link(callback)
result = do_something(self.data)
return result
Greenlet().link()
を通じて、あなたの協程にコールバックを追加することができます.このコールバック関数は、1つのパラメータ、すなわち、このコヒーレンスの例(g1
)のみを受信する._run()
関数が表示されますが、実際には結果result
が返されます.では、コールバック関数でこの値を取得できますか.実は可能で、この値はg1.value
に存在します.やはりその言葉ですが、このようなデザインは、余っているように見えるかもしれません.しかし、フレームワークの機能が増加するにつれて、このような余分な設計はあなたのコードをますます柔軟にします.