Python 之併發程式設計之協程

2022-05-08 21:36:09 字數 2483 閱讀 3769

def gen():

for i in range(10):

yield i

# 初始化生成七函式 返回生成器物件

,簡稱生成器

mygen = gen()

for i in mygen:

print(i)

# (1) 用協程改寫成生產者消費者

def producer():

for i in range(100):

yield i

def consumer():

g = producer()

for i in g:

print(i)

# (2) 協程的具體實現

from greenlet import greenlet

import time

switch 利用它進行任務的切塊

,一般在阻塞的時候切塊

只能預設手動切換

缺陷: 不能規避

io,不能自動實現遇到阻塞就切換

def eat():

print("eat one")

# 手動切換

play

這個協程中

g2.switch()

time.sleep(1)

print("eat two")

def play():

print("play one")

time.sleep(1)

print("play two")

g1.switch()

g1 = greenlet(eat)

g2 = greenlet(play)

g1.switch()

eat one

play one

play two

eat two

# (3) 缺陷

:gevent

不能夠識別

time.sleep

是阻塞import gevent

# gevent 其中有乙個

spawn

類似於switch ,

也是切換任務的

import time

def eat():

print("eat one")

time.sleep(1)

print("eat two")

def play():

print("play one")

time.sleep(1)

print("play two")

# 利用

gevent

建立協程物件

g1g1 = gevent.spawn(eat)

#利用gevent

建立協程物件

g2g2 = gevent.spawn(play)

# 協程的阻塞是

join

等待當前協程執行完畢之後

,再向下執行

g1.join()  #阻塞直到

g1協程執行完畢

g2.join()  #阻塞直到

g2協程執行完畢

print("主線程執行完畢

")# (4) 高階 用

gevent.sleep

來取代time.sleep()

import gevent

def eat():

print("eat one")

gevent.sleep(1)

print("eat two")

def play():

print("play one")

gevent.sleep(1)

print("play two")

g1 = gevent.spawn(eat)

g2 = gevent.spawn(play)

g1.join()

g2.join()

print("主線程執行完畢

")# (5) 終極解決識別問題

# spawn gevent 中

spawn

遇到阻塞會自動切換協程任務

from gevent import monkey

# 把patch_all

下面引入的所有模組中的阻塞識別出來

monkey.patch_all()

import time

import gevent

def eat():

print("eat one")

time.sleep(1)

print("eat two")

def play():

print("play one")

time.sleep(1)

print("play two")

g1 = gevent.spawn(eat)

g2 = gevent.spawn(play)

g1.join()

g2.join()

print("主程序執行結束

...")

二.協程例子

併發程式設計之協程

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

併發程式設計之 協程

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

python 併發程式設計 協程 協程介紹

協程 是單執行緒下的併發,又稱微執行緒,纖程。英文名coroutine。一句話說明什麼是執行緒 協程是一種使用者態的輕量級執行緒,即協程是由使用者程式自己控制排程的 需要強調的是 1.python的執行緒屬於核心級別的,即由作業系統控制排程 如單執行緒遇到io或執行時間過長就會被迫交出cpu執行許可...