geventについてのまとめ


0 x 00基本概念
geventはlibevとgreenletに基づくpython非同期フレームワークである.
libevは高性能なイベントループ(event loop)実装である.イベントループ(IO多重化とも呼ばれる)は,ブロック問題を解決し,同時化を実現する方法である.簡単に言えば、event loopioイベントの変化をキャプチャし、処理します.ブロックに遭遇すると、飛び出します.ブロックが終わったら、続けます.これは、システムの最下位レベルのselect関数およびそのアップグレード版:pollおよびepollに依存する.「コンピュータシステムを深く理解する」という本では、これについて深く検討している.greenletpythonの連携管理・切替モジュールである.greenletを使用すると、異なるタスク間を明示的に切り替えることができます.
0 x 01 ActorモードActorErlang言語の真髄である.メッセージングベースの同時メカニズムを強調します.この文章を模倣して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()が呼び出されるメッセージキューからデータを受信することができる.geventmonkey 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に存在します.
やはりその言葉ですが、このようなデザインは、余っているように見えるかもしれません.しかし、フレームワークの機能が増加するにつれて、このような余分な設計はあなたのコードをますます柔軟にします.