Python程式中的協程操作 greenlet模組

2022-04-10 20:46:52 字數 1615 閱讀 4169

目錄安裝:pip3 install greenlet

from greenlet import greenlet

def eat(name):

print('%s eat 1' %name)

g2.switch('randy')

print('%s eat 2' %name)

g2.switch()

def play(name):

print('%s play 1' %name)

g1.switch()

print('%s play 2' %name)

g1=greenlet(eat)

g2=greenlet(play)

g1.switch('randy')#可以在第一次switch時傳入引數,以後都不需要

randy eat 1

randy play 1

randy eat 2

randy play 2

單純的切換(在沒有io的情況下或者沒有重複開闢記憶體空間的操作),反而會降低程式的執行速度。

#順序執行

import time

def f1():

res = 1

for i in range(100000000):

res += i

def f2():

res = 1

for i in range(100000000):

res *= i

start = time.time()

f1()

f2()

stop = time.time()

print('run time is %s' % (stop - start)) # 10.985628366470337

run time is 13.264543294906616

# 切換

from greenlet import greenlet

import time

def f1():

res = 1

for i in range(100000000):

res += i

g2.switch()

def f2():

res = 1

for i in range(100000000):

res *= i

g1.switch()

start = time.time()

g1 = greenlet(f1)

g2 = greenlet(f2)

g1.switch()

stop = time.time()

print('run time is %s' % (stop - start)) # 52.763017892837524

greenlet只是提供了一種比generator更加便捷的切換方式,當切到乙個任務執行時如果遇到io,那就原地阻塞,仍然是沒有解決遇到io自動切換來提公升效率的問題。

單執行緒裡的這20個任務的**通常會既有計算操作又有阻塞操作,我們完全可以在執行任務1時遇到阻塞,就利用阻塞的時間去執行任務2...如此,才能提高效率,這就用到了gevent模組。

Python程式中的協程操作 gevent模組

安裝 pip3 install gevent gevent 是乙個第三方庫,可以輕鬆通過gevent實現併發同步或非同步程式設計,在gevent中用到的主要模式是greenlet,它是以c擴充套件模組形式接入python的輕量級協程。greenlet全部執行在主程式作業系統程序的內部,但它們被協作式...

python協程使用 協程的案例

概念 使用者層面在乙個執行緒中進行多工切換的機制,比執行緒更加輕量級 實現併發量更大 協程的使用 使用第三方庫 gevent gevent 是乙個基於協程的 python 網路庫,在遇到 io 阻塞時,程式會自動進行切換,可以讓我們用同步的放肆寫非同步 io 協程的使用 from gevent im...

python中協程的優點

1.協程可以讓程式停留在上一次被呼叫的位置.當程式停止時,去執行其他的程式。優點 1 程序和執行緒都面臨著核心態和使用者態的切換問題而耗費許多切換時間,而協程就是使用者自己控制切換的時機,不再需要陷入系統的核心態。協程的執行效率非常高。因為子程式切換不是執行緒切換,而是由程式自身控制。因此,沒有執行...