我最近阅读了关于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次,我能做些什么。 你的答案会得到很好的赞赏。
答案 0 :(得分:1)
您的代码经历了两个sleep(3)
。在您启动反应堆并使Twisted运行之前。另一个是delay
函数。
现在第一次等待3秒后,反应堆就开始了。这也是线程实际启动的点。大约3秒后它返回并打印结果。一共应该花费6s多一点。
或简而言之:Twisted在反应堆运行之前没有做任何事情。