協程定義及與執行緒的區別 半自動與全自動

2021-10-24 05:49:38 字數 2543 閱讀 5476

協程的定義:

微執行緒,是是乙個比執行緒還小的執行單元

稱作執行單元的原因:協程是自帶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執行。注意關鍵字切換,自然是切換...