问题:使用tornado的@gen.coroutine进行装饰,无法实现异步的功能
解决:time.sleep()是阻止异步的,可以使用gen.sleep()代替实现
方法:
取消time.sleep()的使用
代码如下:
class ApiFocusCheckingHandler(BaseHandler):
# @gen.coroutine
# def post(self):
# sec_count = 5
# yield self.process_count(sec_count)
# self.write({'code': 'ok'})
# @gen.coroutine
# def process_count(self, num):
# yield
# while num:
# time.sleep(1) # 换成gen.sleep(1)就可实现异步了
# num -= 1
# raise gen.Return(None)
# 上面的代码是无法实现异步的,是阻塞的
@gen.coroutine
def post(self):
resp = yield self.GetUser()
self.write(resp)
@gen.coroutine
def GetUser(self):
client = httpclient.AsyncHTTPClient()
resp = yield client.fetch("https://www.github.com")
if resp.code == 200:
resp = resp.body
else:
resp = {"message": "fetch client error"}
logger.error("client fetch error %d, %s" % (resp.code, resp.message))
raise gen.Return(resp)
注:本人使用的是redis + rq + gen.coroutine实现异步处理的
参考:
https://blog.csdn.net/u013038616/article/details/72821600