joefis的答案基本上是正確的,但我敢打賭,一些例子會有所幫助。首先,有幾種方法可以在反應堆啓動後立即運行一些代碼。
這一個是非常簡單的:
def f():
print "the reactor is running now"
reactor.callWhenRunning(f)
另一種方法是使用定時事件,雖然可能沒有理由去做這種方式,而不是使用callWhenRunning
:
reactor.callLater(0, f)
你也可以使用底層的API,其中callWhenRunning
實施於:
reactor.addSystemEventTrigger('after', 'startup', f)
您還可以使用服務。這涉及更多一點,因爲它涉及使用twistd(1)
(或其他將把服務系統掛接到反應堆的其他東西)。但是你可以寫這樣的一類:
from twisted.application.service import Service
class ThingDoer(Service):
def startService(self):
print "The reactor is running now."
然後寫一個.tac文件是這樣的:
from twisted.application.service import Application
from thatmodule import ThingDoer
application = Application("Do Things")
ThingDoer().setServiceParent(application)
最後,您可以運行使用twistd(1)
此.tac文件:
$ twistd -ny thatfile.tac
當然,這只是告訴你如何在反應堆運行後做一件事,這不完全是你要求的。不過,這是同樣的想法 - 您定義了一些事件處理程序並通過讓該處理程序調用來請求接收事件;當它被調用時,你會做東西。同樣的想法適用於你用海螺做的任何事情。
可以在sshsimpleclient.py在Conch examples看到這一點,比如我們有:
class CatChannel(channel.SSHChannel):
name = 'session'
def openFailed(self, reason):
print 'echo failed', reason
def channelOpen(self, ignoredData):
self.data = ''
d = self.conn.sendRequest(self, 'exec', common.NS('cat'), wantReply = 1)
d.addCallback(self._cbRequest)
def _cbRequest(self, ignored):
self.write('hello conch\n')
self.conn.sendEOF(self)
def dataReceived(self, data):
self.data += data
def closed(self):
print 'got data from cat: %s' % repr(self.data)
self.loseConnection()
reactor.stop()
在這個例子中,channelOpen
是,當一個新的通道被打開調用的事件處理。它向服務器發送請求。它得到一個Deferred
,它附加了一個回調。該回調函數是一個事件處理函數,當請求成功時將會調用該函數(在這種情況下,執行cat
時)。 _cbRequest
是它附加的回調函數,該方法將採取下一步 - 將一些字節寫入通道然後關閉它。然後是dataReceived
事件處理程序,當通過通道接收字節時調用該事件處理程序,並在通道關閉時調用closed
事件處理程序。
因此,您可以在這裏看到四個不同的事件處理程序,其中一些正在啓動操作,最終會觸發以後的事件處理程序。所以要回到你關於做一個又一個的問題的問題,如果你想打開兩個貓通道,一個接一個,那麼在closed
事件處理程序可以打開一個新的通道(而不是停止反應堆爲它在這個例子中)。