<p>约菲斯的回答基本上是正确的,但我打赌有些例子会有所帮助。首先,有几种方法可以在反应堆启动后立即运行一些代码。在</p>
<p>这个很简单:</p>
<pre><code>def f():
print "the reactor is running now"
reactor.callWhenRunning(f)
</code></pre>
<p>另一种方法是使用定时事件,尽管可能没有理由用这种方式来代替使用<code>callWhenRunning</code>:</p>
^{pr2}$
<p>您还可以使用底层API,该API按以下方式实现<code>callWhenRunning</code>:</p>
<pre><code>reactor.addSystemEventTrigger('after', 'startup', f)
</code></pre>
<p>你也可以使用服务。这有点复杂,因为它涉及到使用<code>twistd(1)</code>(或其他将把服务系统连接到反应堆上的东西)。但你可以这样写一个类:</p>
<pre><code>from twisted.application.service import Service
class ThingDoer(Service):
def startService(self):
print "The reactor is running now."
</code></pre>
<p>然后写一个.tac文件如下:</p>
<pre><code>from twisted.application.service import Application
from thatmodule import ThingDoer
application = Application("Do Things")
ThingDoer().setServiceParent(application)
</code></pre>
<p>{tac>最后可以使用这个文件</p>
<pre><code>$ twistd -ny thatfile.tac
</code></pre>
<p>当然,这只告诉你如何在反应堆运行后做一件事,这并不是你所要求的。不过,这是相同的想法——定义一些事件处理程序,并通过调用该处理程序来请求接收事件;当调用该处理程序时,您可以执行一些操作。同样的想法也适用于你用海螺做的任何事情。在</p>
<p>您可以在<a href="http://twistedmatrix.com/documents/10.0.0/conch/examples/" rel="nofollow noreferrer">Conch examples</a>中看到这一点,例如sshsimpleclient.py我们有:</p>
<pre><code>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()
</code></pre>
<p>在本例中,<code>channelOpen</code>是打开新通道时调用的事件处理程序。它向服务器发送一个请求。它返回一个<code>Deferred</code>,并附加一个回调。该回调是一个事件处理程序,当请求成功时(在本例中,当<code>cat</code>被执行时)将调用它。<code>_cbRequest</code>是它附加的回调函数,该方法采取下一步-向通道写入一些字节,然后关闭它。然后是<code>dataReceived</code>事件处理程序,当通过chnanel接收到字节时调用它,<code>closed</code>事件处理程序在通道关闭时调用。在</p>
<p>因此,您可以在这里看到四个不同的事件处理程序,其中一些正在启动操作,这些操作最终将触发后面的事件处理程序。在</p>
<p>因此,回到您关于一件接一件地做一件事的问题,如果您想打开两个cat通道,一个接一个,那么在<code>closed</code>事件处理程序中可以打开一个新通道(而不是像本例中那样停止反应器)。在</p>