高效能python程式設計之協程 stackless

2021-07-26 13:00:56 字數 3286 閱讀 7958

我們都知道併發(不是並行)程式設計目前有四種方式,多程序,多執行緒,非同步,和協程。

多程序程式設計在python中有類似c的os.fork,當然還有更高層封裝的multiprocessing標準庫,在之前寫過的python高可用程式設計方法中提供了類似nginx中master process和worker process間訊號處理的方式,保證了業務程序的退出可以被主程序感知。

多執行緒程式設計python中有thread和threading,在linux下所謂的執行緒,實際上是lwp輕量級程序,其在核心中具有和程序相同的排程方式,有關lwp,cow(寫時拷貝),fork,vfork,clone等的資料較多,這裡不再贅述。

非同步在linux下主要有三種實現select,poll,epoll,關於非同步不是本文的重點。

說協程肯定要說yield,我們先來看乙個例子:

#coding=utf-8

importtime

importsys

# 生產者

defproduce(l):

i=0

while1:

ifi <5:

yieldi

i=i+1

time.sleep(1)

else:

return

# 消費者

defconsume(l):

p=produce(l)

while1:

try:

p.next()

whilelen(l) >0:

printl.pop()

exceptstopiteration:

sys.exit(0)

l=

consume(l)

通過上面的例子我們看到協程的排程對於核心來說是不可見的,協程間是協同排程的,這使得併發量在上萬的時候,協程的效能是遠高於執行緒的。

importstackless

importurllib2

defoutput():

while1:

url=chan.receive()

printurl

f=urllib2.urlopen(url)

#print f.read()

printstackless.getcurrent()

definput():

f=open('url.txt')

l=f.readlines()

foriinl:

chan.send(i)

chan=stackless.channel()

[stackless.tasklet(output)()foriinxrange(10)]

stackless.tasklet(input)()

stackless.run()

關於協程,可以參考greenlet,stackless,gevent,eventlet等的實現。

網路程式設計之 協程

協程,又稱微執行緒,纖程。英文名coroutine。一句話說明什麼是執行緒 協程是一種使用者態的輕量級執行緒。協程擁有自己的暫存器上下文和棧。協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧。因此 協程能保留上一次呼叫時的狀態 即所有區域性狀態的乙個特...

併發程式設計之協程

協程 是單執行緒下的併發,一句話說明什麼是執行緒 協程是一種使用者態的輕量級執行緒,即協程是由使用者程式自己控制排程的。對比作業系統控制線程的切換,使用者在單執行緒內控制協程的切換 優點 1.協程的切換開銷更小,屬於程式級別的切換,作業系統完全感知不到,因而更加輕量級 2.單執行緒內就可以實現併發的...

併發程式設計之 協程

程序 資源單位 執行緒 執行單位 協程 單執行緒下實現併發 併發 切換 儲存狀態 程式設計師自己通過 自己檢測程式中的io 一旦遇到了io自己通過 切換 給作業系統的感覺就是你這個執行緒沒有任何的io 從而提公升 的執行效率 切換 儲存狀態一定能夠提公升效率嗎?1.當任務是io密集型的情況下 提公升...