協程的定義:
微執行緒,是是乙個比執行緒還小的執行單元
稱作執行單元的原因:協程是自帶cpu上下文的
執行緒:系統進行排程的基本單位
執行緒切換的過程中,從系統的角度來講,不只是cpu的上下文(cpu暫存器和程式計數器)切換,系統為了程式能夠高效執行,每乙個執行緒都有自己快取起來的資料,作業系統除了cpu上下文切換,還要恢復這些快取資料,執行緒切換十分的消耗資源。
協程:開發者來確定,什麼時候切換,切換多少次,協程之間的切換,只是cpu上下文的切換(一分鐘切換上百萬次)
系統不能感知協程,所以系統不會直接做協程切換
協程不能夠cpu多核特點,多程序+多協程
就效能消耗
協程 < 執行緒 < 程序
協程是唯一我們可以控制的。執行緒和程序就是系統自己執行的
from greenlet import greenlet #導包
import time
defwork1()
:while
true
:print
('-----work1----------'
) g2.switch(
)#手動操作
time.sleep(1)
#模擬將來可能會出現的耗時操作
defwork2()
:while
true
:print
('-----work2----------'
) g1.switch(
)#手動操作,每個都要手動新增
time.sleep(10)
# 模擬將來可能會出現的耗時操作
if __name__ ==
'__main__'
:#建立協程
g1=greenlet(work1)
g2=greenlet(work2)
#切換到g1中進行執行
g1.switch(
) g2.switch(
)
原版
import gevent
deffunc
(num)
:for i in
range
(num)
:print
('當前的協程是'
,gevent.getcurrent(),
'變數是'
,i) gevent.sleep(1)
# 模擬的是耗時操作
if __name__ ==
'__main__'
: g1 = gevent.spawn(func,3)
g2 = gevent.spawn(func,5)
g1.join(
) g2.join(
)
注意點:
在實際的工作過程中,存在的大量的io操作,但是需要gevent自己去實現io操作切換協程,所以打補丁
from gevent import monkey
monkey.patch_all()
**如下
import gevent
import time
from gevent import monkey
monkey.patch_all(
)def
func
(num)
:for i in
range
(num)
:print
('當前的協程是'
,gevent.getcurrent(),
'變數是'
,i)# gevent.sleep(1) # 模擬的是耗時操作
time.sleep(1)
if __name__ ==
'__main__'
: g1 = gevent.spawn(func,3)
g2 = gevent.spawn(func,5)
g3 = gevent.spawn(func,6)
g1.join(
) g2.join(
) g3.join(
)
例項輸出例子:(**如下)
import gevent
import time
from gevent import monkey
#猴子補丁
monkey.patch_all(
)def
func
(name)
:for i in
range(10
):print
(name,i)
time.sleep(1)
gevent.joinall(
[ gevent.spawn(func,
'w1'),
gevent.spawn(func,
'w2'),
gevent.spawn(func,
'w3'),
])
協程與執行緒
reference 協程不只在go語言中實現了,其實目前大部分語言都實現了自己的一套協程,包括c erlang python lua j ascript ruby等。相對於協程,你可能對程序和執行緒更為熟悉。程序一般代表乙個應用服務,在乙個應用服務中可以建立多個執行緒,而協程與程序 執行緒的概念不一...
協程與執行緒的區別 程序 執行緒 和 協程對比
程序 執行緒,都是有核心進行排程,有 cpu 時間片的概念,進行 搶占式排程。協程 使用者級執行緒 完全由使用者自己的程式進行排程 協作式排程 需要協程自己主動把控制權轉讓出去之後,其他協程才能被執行到。goroutine 和協程區別 本質上,goroutine 就是協程。不同的是,golang 在...
程序 執行緒與協程
程序的出現是為了更好的利用cpu資源使到併發成為可能。假設有兩個任務a和b,當a遇到io操作,cpu默默的等待任務a讀取完操作再去執行任務b,這樣無疑是對cpu資源的極大的浪費。聰明的老大們就在想若在任務a讀取資料時,讓任務b執行,當任務a讀取完資料後,再切換到任務a執行。注意關鍵字切換,自然是切換...