twisted的defer.Deferred (from twisted.internet import defer)可以返回一个deferred对象.
注:deferToThread使用线程实现的,不推荐过多使用
***把同步函数变为异步(返回一个Deferred)***
twisted的deferToThread(from twisted.internet.threads import deferToThread)也返回一个deferred对象,不过回调函数在另一个线程处理,主要用于数据库/文件读取操作
..
# 代码片段
def dataReceived(self, data):
now = int(time.time())
for ftype, data in self.fpcodec.feed(data):
if ftype == 'oob':
self.msg('OOB:', repr(data))
elif ftype == 0x81: # 对服务器请求的心跳应答(这个是解析 防疲劳驾驶仪,发给gps上位机的,然后上位机发给服务器的)
self.msg('FP.PONG:', repr(data))
else:
self.msg('TODO:', (ftype, data))
d = deferToThread(self.redis.zadd, "beier:fpstat:fps", now, self.devid)
d.addCallback(self._doResult, extra)
下面这儿完整的例子可以给大家参考一下
# -*- coding: utf-8 -*-
from twisted.internet import defer, reactor
from twisted.internet.threads import deferToThread
import functools
import time
# 耗时操作 这是一个同步阻塞函数
def mySleep(timeout):
time.sleep(timeout)
# 返回值相当于加进了callback里
return 3
def say(result):
print "耗时操作结束了, 并把它返回的结果给我了", result
# 用functools.partial包装一下, 传递参数进去
cb = functools.partial(mySleep, 3)
d = deferToThread(cb)
d.addCallback(say)
print "你还没有结束我就执行了, 哈哈"
reactor.run()