更多内容请访问我的个人博客www.tenliu.top
twisted之defer
工作中一项目,其中一个环节比较耗时,又无法解耦合,流程中下一环节必须等待这个环节结果。由此想到异步框架twisted的延迟defer,之前只是知道有这么个东西。
defer就是使耗时的任务暂时迅速返回一个deferred对象,让流程可以继续执行下去,不再这里耗费时间。而耗时任务则在子线程执行,结果通过回调函数处理。
网上相关知识不少,但很少有一个代码实例,可以一目了然的说明这个事情
#!/usr/bin/env python
# encoding: utf-8
from twisted.internet import reactor, defer, threads
import time
def CostTimeWork(x):
'''
这是一个耗时的任务
'''
for i in xrange(3):
print("cost time:%s\t%s" % (i,x))
time.sleep(1)
return x
def PrintData(res):
'''
回调函数,打印结果
当耗时任务结束后,想要如何对结果进行处理,就要用到回调。
我这里只是简单打印结果而已
'''
print res
def main():
'''
主函数
执行结果:打印1之后,不在等待 耗时的2执行完成,继续向下执行3
2完成之后执行回调,进行处理即可
'''
print "====1==="
#将耗时函数 放入另一个线程实行,返回一个deferred对象
d = threads.deferToThread(CostTimeWork,"====2===")
#添加回调函数
d.addCallback(PrintData)
print "====3==="
if __name__=="__main__":
main()
reactor.run()
>>>>>>>>>>>>>>>>执行结果>>>>>>>>>>>>>>>>
====1===
====3===
cost time:0 ====2===
cost time:1 ====2===
cost time:2 ====2===
====2===
CostTimeWork就是你的耗时任务
PrintData 是你对耗时任务完成后的操作
main是主流程