关于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密集型的函数用异步做就没有意义。很郁闷。可能还有其他方法,有待研究,文章会随时更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值