我們都知道併發(不是並行)程式設計目前有四種方式,多程序,多執行緒,非同步,和協程。
多程序程式設計在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
import
time
import
sys
# 生產者
def
produce(l):
i
=
0
while
1
:
if
i <
5
:
yield
i
i
=
i
+
1
time.sleep(
1
)
else
:
return
# 消費者
def
consume(l):
p
=
produce(l)
while
1
:
try
:
p.
next
()
while
len
(l) >
0
:
print
l.pop()
except
stopiteration:
sys.exit(
0
)
l
=
consume(l)
通過上面的例子我們看到協程的排程對於核心來說是不可見的,協程間是協同排程的,這使得併發量在上萬的時候,協程的效能是遠高於執行緒的。
import
stackless
import
urllib2
def
output():
while
1
:
url
=
chan.receive()
print
url
f
=
urllib2.urlopen(url)
#print f.read()
print
stackless.getcurrent()
def
input
():
f
=
open
(
'url.txt'
)
l
=
f.readlines()
for
i
in
l:
chan.send(i)
chan
=
stackless.channel()
[stackless.tasklet(output)()
for
i
in
xrange
(
10
)]
stackless.tasklet(
input
)()
stackless.run()
關於協程,可以參考greenlet,stackless,gevent,eventlet等的實現。
網路程式設計之 協程
協程,又稱微執行緒,纖程。英文名coroutine。一句話說明什麼是執行緒 協程是一種使用者態的輕量級執行緒。協程擁有自己的暫存器上下文和棧。協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧。因此 協程能保留上一次呼叫時的狀態 即所有區域性狀態的乙個特...
併發程式設計之協程
協程 是單執行緒下的併發,一句話說明什麼是執行緒 協程是一種使用者態的輕量級執行緒,即協程是由使用者程式自己控制排程的。對比作業系統控制線程的切換,使用者在單執行緒內控制協程的切換 優點 1.協程的切換開銷更小,屬於程式級別的切換,作業系統完全感知不到,因而更加輕量級 2.單執行緒內就可以實現併發的...
併發程式設計之 協程
程序 資源單位 執行緒 執行單位 協程 單執行緒下實現併發 併發 切換 儲存狀態 程式設計師自己通過 自己檢測程式中的io 一旦遇到了io自己通過 切換 給作業系統的感覺就是你這個執行緒沒有任何的io 從而提公升 的執行效率 切換 儲存狀態一定能夠提公升效率嗎?1.當任務是io密集型的情況下 提公升...