30

Twisted でリバース プロキシを開発するのに問題があります。それは機能しますが、過度に複雑で複雑に見えます。その多くはブードゥーのように感じます。

Web や書籍に、非同期プログラム構造の単純で堅実な例はありますか? 一種のベスト プラクティス ガイドですか? プログラムを完成させた後も、スパゲッティの入ったボウルを見るのではなく、何らかの方法で構造を確認できるようにしたいと考えています。

4

1 に答える 1

65

Twisted には多数の例が含まれています。特に、「evolution of Finger」チュートリアルには、非同期プログラムが非常に小さなカーネルから多くの可動部品を備えた複雑なシステムに成長する方法についての完全な説明が含まれています。もう 1 つ興味があるかもしれないのは、単純なサーバーの作成に関するチュートリアルです。

Twisted やその他の非同期ネットワーク ライブラリ ( asyncoreMINAACEなど) について留意すべき重要な点は、何かが発生した場合にのみコードが呼び出されるということです。「ブードゥー」のように聞こえることが最も多い部分は、コールバックの管理です。たとえば、Deferred. 直線的に実行されるコードを書くことに慣れていて、すぐに結果を返す関数のみを呼び出す場合、何かがコールバックするのを待つという考えは混乱を招く可能性があります。しかし、コールバックには魔法のようなものはなく、「ブードゥー教」でもありません。最も低いレベルでは、リアクターはただ座って、少数の出来事の 1 つが起こるのを待っています。

  1. データは接続で到着します (dataReceivedプロトコルで呼び出します)
  2. 時間が経過しました( に登録された関数を呼び出しますcallLater)。
  3. 接続が受け入れられました (または関数buildProtocolで登録されたファクトリを呼び出します)。listenXXXconnectXXX
  4. connectionLost接続が切断されました (適切なプロトコルで呼び出します)

すべての非同期プログラムは、これらのイベントのいくつかをフックすることから始まり、リアクターを開始してイベントが発生するのを待ちます。もちろん、イベントが発生すると、フックされたり切断されたりするイベントがさらに発生するため、プログラムは順調に進みます。それを超えて、興味深いまたは特別な非同期プログラム構造について特別なことは何もありません。イベント ハンドラーとコールバックは単なるオブジェクトであり、コードは通常の方法で実行されます。

このプロセスがいかに単純かを示す簡単な「イベント駆動型エンジン」を次に示します。

# Engine
import time
class SimplestReactor(object):
    def __init__(self):
        self.events = []
        self.stopped = False

    def do(self, something):
        self.events.append(something)

    def run(self):
        while not self.stopped:
            time.sleep(0.1)
            if self.events:
                thisTurn = self.events.pop(0)
                thisTurn()

    def stop(self):
        self.stopped = True

reactor = SimplestReactor()

# Application    
def thing1():
    print 'Doing thing 1'
    reactor.do(thing2)
    reactor.do(thing3)

def thing2():
    print 'Doing thing 2'

def thing3():
    print 'Doing thing 3: and stopping'
    reactor.stop()

reactor.do(thing1)
print 'Running'
reactor.run()
print 'Done!'

Twisted のようなライブラリのコアでは、メイン ループの関数は ではなく、またはのsleepようなオペレーティング システムの呼び出しであり、Python の select モジュール のようなモジュールによって公開されます。これはプラットフォーム間で大きく異なる API であり、ほぼすべての GUI ツールキットに独自のバージョンがあるためです。Twisted は現在、このテーマの 14 の異なるバリエーションへの抽象的なインターフェースを提供しています。そのような API が提供する一般的なことは、「ここに、私が待っているイベントのリストがあります。そのうちの 1 つが発生するまでスリープ状態になり、次に起きて、それがどのイベントであったかを教えてください」と言う方法を提供することです。 "select()poll()select

于 2008-09-17T09:29:45.977 に答える