雖然python擁有真正的線程亿絮,由于GIL(global interpreter lock)的存在仍律,python解釋器給每個(gè)線程都加上了鎖拘悦,最多執(zhí)行100行代碼就必須移交程序執(zhí)行權(quán)限诈豌,使得其他線程也有機(jī)會(huì)被執(zhí)行。在當(dāng)下硬件資源過剩的情況下是不合理的云矫,不能實(shí)現(xiàn)真正意義上的多線程并行膳沽。據(jù)了解,在業(yè)界也多以多進(jìn)程和分布式來實(shí)現(xiàn)并行任務(wù)让禀。(或協(xié)程)
manager模塊
class MyManager(BaseManager):
pass
多進(jìn)程或多線程是解決并發(fā)任務(wù)一種方式
針對(duì)IO密集型的場(chǎng)景中使用異步IO(event drive)挑社,一個(gè)線程就可處理多個(gè)IO請(qǐng)求,避免了多線程的頻繁切換
我需要4個(gè)人的位置用餐
不好意思巡揍,前面還有x在等待
那我去逛一逛痛阻,有位置了告訴我
好的
阻塞、非阻塞
場(chǎng)景:銀行排隊(duì)辦業(yè)務(wù)
阻塞:傻等
非阻塞:等的同時(shí)玩局游戲
同步腮敌、異步(同步異步指得到通知的方式不同)
場(chǎng)景:在窗口上辦業(yè)務(wù)
同步:詢問業(yè)務(wù)員阱当,好了沒好了沒
異步:業(yè)務(wù)員說,辦好了我告訴你
協(xié)程Coroutine
在單線程中異步完成多個(gè)IO操作
python的coroutine使用generator(生成器)糜工,yield關(guān)鍵字不光能在next()調(diào)用的時(shí)候返回值斗这,還能在send()啟動(dòng)generator的時(shí)候接收參數(shù)
簡(jiǎn)單示例:
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將一個(gè)generator標(biāo)記為協(xié)程,在執(zhí)行到y(tǒng)ield from時(shí)啤斗,拋出任務(wù),立刻轉(zhuǎn)到下一個(gè)協(xié)程赁咙,直到任務(wù)返回钮莲;可以將多個(gè)協(xié)程打包為tasks列表免钻,一次性調(diào)用asyncio.wait(tasks)
在python 3.5版本中使用@async和await替代@asyncio.coroutine和yield from,進(jìn)一步簡(jiǎn)化代碼