写了几个接口,也就接触到了python的异步。
python的协程使用异步实现的(说法不知道准不准确),所以直接使用协程来做,看的很多例子也是这么干的
先看代码:
import json
import tornado
import tornado.web
from tornado import gen
from tornado.options import define, options
define('port', default=8000, help='run on the given port', type = int)
@tornado.gen.coroutine
def count():
print '-------sleep begin'
gen.sleep(10)
print '-------sleep finish'
r = {}
r['s'] = 1
raise tornado.gen.Return(r)
class test1(tornado.web.RequestHandler):
@tornado.gen.coroutine
def get(self):
print '------test1'
r = yield count()
s = 'return of test1\n'
print 'count returns'
self.write(s)
self.write(json.dumps(r))
class test2(tornado.web.RequestHandler):
@tornado.gen.coroutine
def get(self):
print 'do test2'
self.write('test2 begin \n')
self.write('test2 end')
application = tornado.web.Application([
(r'/cor/test1', test1),
(r'/cor/test2', test2)
])
if __name__ == '__main__':
application.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
说明:
1. 要测试的流程是先请求test1,再请求test2, 看test2能否直接返回结果
2. 在test1中,使用gen.coroutine和yield配合,讲其中的count调用标记为异步(我自己想的说法),这样r作为占位符存在,此后cpu会轮询的检查r是否完成
3. gen模块内的sleep是用异步实现的,所以执行后会立即释放线程控制权,所以打印结果时'---------sleep being'和'----------sleep end'和'count returns'是先后
直接打印出来的。 而sleep换成time模块的sleep就不会实现异步,因为time的sleep不是异步,会一直占线程的控制权。 所以要用异步,前提是异步的函数
自己支持异步。这意味着cpu密集型的函数用异步做就没有意义。很郁闷。可能还有其他方法,有待研究,文章会随时更新