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,进一步简化代码