擅长:python、mysql、java
<p>在使用Twisted时,需要认识到的重要一点是,没有什么可以等待任何东西。当你调用<code>reactor.callLater()</code>时,你要求反应器稍后调用一些东西,而不是现在。调用立即结束(在调度了调用之后,<em>在执行它之前)。因此,您的<code>print</code>语句是一个谎言:您没有等待<code>timeout</code>时间;您根本没有等待。</p>
<p>你可以用多种方法修复它,使用哪种取决于你真正想要什么。如果希望第二个任务在第一个任务<em>启动</em>4秒后启动,只需将第一个任务的延迟(您的<code>timeout</code>变量)添加到第二个任务的延迟中。不过,第一个任务可能不会在您计划的时间准确开始;如果Twisted太忙而不能更早开始,它可能会在稍后开始。另外,如果你的任务需要很长时间,在第二个任务开始之前,它可能不会真正完成。</p>
<p>更常见的方法是第一个任务调度第二个任务,而不是立即调度第二个任务。您可以在第一个任务结束后4秒(通过在第一个任务结束时调用<code>reactor.callLater()</code>)或在第一个任务开始后4秒(通过在第一个任务的<em>start</em>处调用<code>reactor.callLater()</code>)安排它,也可以执行更复杂的计算来确定它应该何时开始,并跟踪已用时间。</p>
<p>当您在Twisted等待中什么都没有意识到时,在执行完所有计划任务后关闭连接就变得很容易了:您只需要调用最后一个任务<code>self.transport.loseConnection()</code>。对于更复杂的情况,您可能希望将<code>Deferred</code>链接在一起,或者使用<code>DeferredList</code>在所有挂起任务都已完成时执行<code>loseConnection()</code>,即使它们不是严格顺序的。</p>