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

2016-12-01  本文已影响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参考资料

上一篇下一篇

猜你喜欢

热点阅读