2008-09-17 74 views
29

我在Twisted中開發反向代理時遇到問題。它有效,但它似乎過於複雜和複雜。如此多的感覺就像伏都教。Python中的異步編程扭曲

是否有任何簡單,堅實在網絡或書籍上的異步程序結構的例子?一種最佳實踐指南?當我完成我的計劃時,我希望能夠以某種方式看到結構,而不是看一碗意大利麪條。

+5

我希望你有更好的運氣,它是目前我最喜歡的框架之一。 – Dustin 2008-11-30 06:02:11

回答

0

如果你不想使用扭曲有一個很好的指導,我用了一陣子回來。這裏是link to it

64

Twisted包含一個large number of examples。其中之一"evolution of Finger" tutorial詳細解釋了異步程序如何從一個非常小的內核發展到一個擁有大量運動部件的複雜系統。另一個你可能感興趣的是簡單的教程writing servers

牢記約扭曲,甚至是其他異步網絡庫(如asyncoreMINA,或ACE)關鍵的一點是,有事時你的代碼只被調用。我最常聽到的部分聽起來像「伏都教」,是回調的管理:例如,Deferred。如果您習慣於編寫直線運行的代碼,並且只調用立即返回結果的函數,那麼等待某些回調函數的想法可能會讓您感到困惑。但沒有什麼不可思議的,沒有關於回調的「巫術」。在最低水平,反應堆只是坐在四周,等待爲數不多的事情之一發生:

  1. 數據到達一個連接上(它會調用dataReceived一個協議上)
  2. 時間已經過去了(它將調用使用callLater註冊的功能)。
  3. 連接已被接受(它將在註冊了listenXXXconnectXXX函數的工廠上調用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!' 

在像扭曲庫的核心,在主迴路的功能是不sleep,但操作系統調用等select()poll(),如暴露由模塊等the Python select module。我說「像」select,因爲這是一個平臺之間差異很大的API,幾乎每個GUI工具包都有自己的版本。 Twisted目前爲這個主題提供了14種不同變體的抽象界面。這種API提供的共同點是提供一種方式來說:「這是我正在等待的事件列表。去睡覺,直到其中一個發生,然後醒來,告訴我它是哪一個。「