关于python协程与异步举例详解程序员

写了几个接口,也就接触到了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

(0)
上一篇 2021年7月17日
下一篇 2021年7月17日

相关推荐

发表回复

登录后才能评论