写了几个接口,也就接触到了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密集型的函数用异步做就没有意义。很郁闷。可能还有其他方法,有待研究,文章会随时更新
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/7429.html