2008-09-17 29 views
29

Twistedで逆プロキシを開発するのに問題があります。それは動作しますが、それはあまりにも複雑で渦巻いているようです。そう多くはブードゥーのように感じます。Pythonでの非同期プログラミングTwisted

ウェブまたは書籍に非同期プログラム構造の例がありますか??ベストプラクティスガイドの一種ですか?私がプログラムを完成させたら、何らかの形で構造を見ることができるようになりたい、スパゲッティのボウルを見ることができないようにしたい。

+5

私はあなたがより良い運びを持っていることを望んでいます。これは現在、私の好きなフレームワークの1つです。 – Dustin

答えて

0

ねじれを使用したくない場合は、私はしばらく前に使った素晴らしいガイドがありました。ここにはlink to itがあります。

64

ツイストは、large number of examplesを含みます。特に"evolution of Finger" tutorialには、非常に小さなカーネルから多くの可動部分を持つ複雑なシステムまで、非同期プログラムがどのように成長するかについての完全な説明が含まれています。あなたにとって興味深いもう一つのチュートリアルは、単にwriting serversです。

ツイスト、あるいは他の非同期ネットワーキング・ライブラリ(のようなasyncoreMINA、またはACE)について、心に留めておくべき重要なことは、何かが起こるとき、あなたのコードが呼び出されるだけということです。 「ブードゥー」のように聞こえる部分は、コールバックの管理です(例:Deferred)。一直線上を走るコードを書くことに慣れていて、ただちに結果を返す関数を呼び出すのであれば、何かを返すのを待つという考えは混乱するかもしれません。しかし、魔法のようなものはありません。コールバックについての「ブードゥー」はありません。最低レベルでは、原子炉はただ周りに座って、物事の数が少ないの一つが起こることを待っている:

  1. データは、(それが議定書にdataReceivedを呼び出します)
  2. 時間が経過している接続に到着(callLaterで登録された関数を呼び出します)。
  3. 接続が承認されました(listenXXXまたはconnectXXXファンクションで登録された工場でbuildProtocolと呼ぶ)。
  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!' 

the Python select moduleようなモジュールによって露出されたように、メインループ内の機能は、sleepではなく、select()又はpoll()ようなオペレーティングシステムコール。私は "like"と言っていますselect、これはプラットフォーム間で多くのAPIが異なるため、ほとんどすべてのGUIツールキットには独自のバージョンがあります。 Twistedは現在、このテーマに関する14の異なるバリエーションに抽象的なインターフェースを提供しています。このようなAPIが提供する一般的なことは、「ここには私が待っているイベントのリストがあります。それらのうちの1つが起こるまで眠りにつき、目を覚まして、それがどれであるかを教えてください。"

関連する問題