python twisted:延迟函数不能立即运行?

时间:2016-02-09 23:54:46

标签: python twisted deferred

我最近阅读了关于python twisted framwork的官方文档。 现在,我可以清楚地理解"延迟不做什么:使你的代码异步",当你调用阻塞功能时,你需要" twisted.internet.threads.deferToThread&#34 ;用于设置线程以运行阻塞功能的函数。

我将使用以下演示进行测试:

from twisted.internet import reactor,defer,threads
import time
def delay(x):
    time.sleep(x)
    return "Time to wake up,you havs sleep %s second!" % x

def getres(res):
    print res
    reactor.stop()

d = threads.deferToThread(delay,3)
d.addCallback(getres)
print "Now my pieces of code not blocking!"

import time
time.sleep(3)
print "now to get the result of the delayed fuction"
reactor.run()

但我得到的结果是出于我的预期:

(myspace) [root@master myspace]# python ttt.py 
Now my pieces of code not blocking!
now to get the result of the delayed fuction
Time to wake up,you havs sleep 3 second!

为什么输出第二行后仍然有3秒延迟("现在得到延迟功能的结果")而不是输出第三行immediaty。     我不知道为什么我的代码总共睡6秒,不是必须是3秒吗?如果它必须是6,那就是说" deferred只延迟了阻塞功能,而不是运行在d.addCallback(getres)"之后正常工作?    如果我只想延迟3次,我能做些什么。    你的答案会得到很好的赞赏。

1 个答案:

答案 0 :(得分:1)

您的代码经历了两个sleep(3)。在您启动反应堆并使Twisted运行之前。另一个是delay函数。

现在第一次等待3秒后,反应堆就开始了。这也是线程实际启动的点。大约3秒后它返回并打印结果。一共应该花费6s多一点。

或简而言之:Twisted在反应堆运行之前没有做任何事情。