しばらくして、グリーンレットを使用するためにdefer.inlineCallbacksを書き直し、次のコードを書くことができました。
from twisted.internet import defer, protocol, reactor from tx_green import inlineCallbacks from greentokyo import Tyrant @inlineCallbacks def test_proto(): t = Tyrant() print t.get_stats() t['kuku'] = 'Green Tyrant!' print t['kuku'] reactor.stop() if __name__=='__main__': test_proto() reactor.run()
便利な点は、グリーンレットにはジェネレーターとの重要な違いがあることです-それらは1つの機能に限定されません。 つまり、t ['kuku']が呼び出されると、t .__ getitem__が実際に呼び出されます。その中で、サーバーからのデータを待っている間に、しばらくメインループに制御を戻すためにswitch()を作成します。 t .__内でget .emit__ yieldを作成しようとした場合、何のメリットも得られずにジェネレーターを作成するだけです。
ご覧のとおり、1つの関数をラップするだけで十分で、その中のすべてが非ブロックモードで動作し始めます。 さらに、一部のモジュールが基になるモジュールの既に変更されたバージョンを使用する場合、その構文は変更されません。 それは完全にです。 例-フォークピラントをグリーンレットを使用してツイストに追加し、変更なしでモデルを使用できます。
不便な点は、このすべてのスタッフィングについて覚えておく必要があることです。データを待つのは悪いことですが、代わりにDeferredだけが落ちます。 そして、メインスレッドに制御を戻すのを忘れると、さらに悪化します。アプリケーション全体を停止してください。 また、このオプションでは、「あなたの脳をひねらない」は輝きません。なぜなら、Twistedの機能を覚えて使用する必要があるからです。
上記のコードでは、制御の戻りを明示的に示すものは何もありません。greenlet.switch()の呼び出しは、Python Tyrantの実装では隠されています。 つまり、この実装のために投獄されます。 そうでない場合は、tx_greenからwait関数を明示的に呼び出す必要があります。 迷惑をかけるのはこの瞬間です-ジャングルをほぼ作成でき、ORMを介してデータベースにアクセスすると、ひそかに待機が発生しますが、それを忘れると、つかみにくいエラーが発生する可能性があります。 urllibを介してサーバーにアクセスすると、サーバーの速度が低下する理由が不思議に思われます。
実装は私のサンドボックスにあります。
ここにそのような小さな記事があります。 いつものように、私は楽しい議論を期待しています。そして、前回の会議のように、コードの良い提案が作家の役割で私とあることを望みます。 ご清聴ありがとうございました。