美文网首页
python系列之(四)并发-异步

python系列之(四)并发-异步

作者: 行走的程序猿 | 来源:发表于2016-12-01 23:14 被阅读137次

    虽然python拥有真正的线程,由于GIL(global interpreter lock)的存在,python解释器给每个线程都加上了锁,最多执行100行代码就必须移交程序执行权限,使得其他线程也有机会被执行。在当下硬件资源过剩的情况下是不合理的,不能实现真正意义上的多线程并行。据了解,在业界也多以多进程和分布式来实现并行任务。(或协程)

    manager模块

    class MyManager(BaseManager):
      pass
    

    多进程或多线程是解决并发任务一种方式
    针对IO密集型的场景中使用异步IO(event drive),一个线程就可处理多个IO请求,避免了多线程的频繁切换

    我需要4个人的位置用餐
    不好意思,前面还有x在等待
    那我去逛一逛,有位置了告诉我
    好的

    阻塞、非阻塞
    场景:银行排队办业务
    阻塞:傻等
    非阻塞:等的同时玩局游戏

    同步、异步(同步异步指得到通知的方式不同)
    场景:在窗口上办业务
    同步:询问业务员,好了没好了没
    异步:业务员说,办好了我告诉你

    协程Coroutine
    在单线程中异步完成多个IO操作
    python的coroutine使用generator(生成器),yield关键字不光能在next()调用的时候返回值,还能在send()启动generator的时候接收参数
    简单示例:

    def consumer(): 
      r = '' 
      while True: 
        n = yield r 
        if not n: 
          return print('[CONSUMER] Consuming %s...' % n) 
        r = '200 OK'
    
    def produce(c): 
      c.send(None) 
      n = 0 
      while n < 5: 
        n = n + 1 
        print('[PRODUCER] Producing %s...' % n) 
        r = c.send(n) 
        print('[PRODUCER] Consumer return: %s' % r) 
        c.close()
    
    c = consumer()
    produce(c)
    

    python asyncio模块
    利用@asyncio.coroutine将一个generator标记为协程,在执行到yield from时,抛出任务,立刻转到下一个协程,直到任务返回;可以将多个协程打包为tasks列表,一次性调用asyncio.wait(tasks)
    在python 3.5版本中使用@async和await替代@asyncio.coroutine和yield from,进一步简化代码

    异步IO参考资料

    相关文章

      网友评论

          本文标题:python系列之(四)并发-异步

          本文链接:https://www.haomeiwen.com/subject/etnxmttx.html