我在Twisted中開發反向代理時遇到問題。它有效,但它似乎過於複雜和複雜。如此多的感覺就像伏都教。Python中的異步編程扭曲
是否有任何簡單,堅實在網絡或書籍上的異步程序結構的例子?一種最佳實踐指南?當我完成我的計劃時,我希望能夠以某種方式看到結構,而不是看一碗意大利麪條。
我在Twisted中開發反向代理時遇到問題。它有效,但它似乎過於複雜和複雜。如此多的感覺就像伏都教。Python中的異步編程扭曲
是否有任何簡單,堅實在網絡或書籍上的異步程序結構的例子?一種最佳實踐指南?當我完成我的計劃時,我希望能夠以某種方式看到結構,而不是看一碗意大利麪條。
如果你不想使用扭曲有一個很好的指導,我用了一陣子回來。這裏是link to it。
Twisted包含一個large number of examples。其中之一"evolution of Finger" tutorial詳細解釋了異步程序如何從一個非常小的內核發展到一個擁有大量運動部件的複雜系統。另一個你可能感興趣的是簡單的教程writing servers。
牢記約扭曲,甚至是其他異步網絡庫(如asyncore,MINA,或ACE)關鍵的一點是,有事時你的代碼只被調用。我最常聽到的部分聽起來像「伏都教」,是回調的管理:例如,Deferred
。如果您習慣於編寫直線運行的代碼,並且只調用立即返回結果的函數,那麼等待某些回調函數的想法可能會讓您感到困惑。但沒有什麼不可思議的,沒有關於回調的「巫術」。在最低水平,反應堆只是坐在四周,等待爲數不多的事情之一發生:
dataReceived
一個協議上)callLater
註冊的功能)。listenXXX
或connectXXX
函數的工廠上調用buildProtocol
)。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提供的共同點是提供一種方式來說:「這是我正在等待的事件列表。去睡覺,直到其中一個發生,然後醒來,告訴我它是哪一個。「
我希望你有更好的運氣,它是目前我最喜歡的框架之一。 – Dustin 2008-11-30 06:02:11