Python實現協程的幾種方法

2021-10-24 18:13:46 字數 2387 閱讀 9275

非同步化框架一部分

協程詳解

python中實現協程的幾種方法:

通過greenlet實現協程

pip install greenlet -i 	--安裝模組

from greenlet import greenlet --匯入模組

def fun1():

print(1) -- 第二步: 輸出 1

gr2.switch() -- 第三步:執行 gr2 (也就是func2函式)

print(2) -- 第六步:輸出 2

gr2.switch() -- 第七步:執行 gr2 (也就是func2函式)

def fun2():

print(3) -- 第四步:輸出 3

gr1.switch() -- 第五步:執行 gr1 (也就是fun1函式)

print(4) -- 第八步:輸出 4

gr1 = greenlet(fun1)

gr2 = greenlet(fun2)

gr1.switch() -- 第一步:去執行 func1 函式

輸出為: 1

3 2

4#如此執行,就實現了乙個執行緒在函式中來回切換執行的方式.也就是協程

通過yield關鍵字實現協程

def fun1():

yield 1

yield from fun2() -- 當呼叫fuc1()函式時,執行到這裡,會執行fuc2函式 ↓

yield 2 -- 等func2函式執行完畢,跳回剛才跳出的位置,繼續執行fuc1

def fun2():

yield 3

yield 4

f1 = fun1() 或 # f = fun1()

for item in f1: # print(next(f))

print(item) # print(next(f))

# print(next(f))

輸出為:1 # print(next(f))34

2#這種方式是偽造的協程,不推薦使用,但是也實現了協程的定義

通過asyncio模組實現(python3.4版本之後的標準庫)

import asyncio

@asyncio.coroutine #打上這個裝飾器,才能是協程函式

def fun1():

print(1)

yield from asyncio.sleep(2) #遇到io耗時操作,自動化切換到tasks中其他任務

print(2)

@asyncio.coroutine

def fun2():

print(3)

yield from asyncio.sleep(2) #遇到io耗時操作,自動化切換到tasks中其他任務

print(4)

tasks = [

asyncio.ensure_future(fun1()),

asyncio.ensure_future(fun2()) #列表中是來回切換的函式

]loop = asyncio.get_event_loop()

loop.run_until_complete(fun1())

#注意遇到io阻塞 自動切換(python3.5之後推薦使用關鍵字)

async & await 關鍵字實現協程(python3.5版本之後)

import asyncio

async def fun1():

print(1)

await asyncio.sleep(2) #遇到io耗時操作,自動化切換到tasks中其他任務

print(2)

async def fun2():

print(3)

await asyncio.sleep(2) #遇到io耗時操作,自動化切換到tasks中其他任務

print(4)

tasks = [

asyncio.ensure_future(fun1()),

asyncio.ensure_future(fun2())

]loop = asyncio.get_event_loop()

loop.run_until_complete(fun1())

#注意遇到io阻塞 自動切換

python協程實現

參考 協程,又稱微執行緒,纖程。英文名coroutine。協程是程式級別的,由程式自己決定如何排程。協程的概念 在子程式執行過程中可以中斷去執行別的子程式,而別的子程式也可以中斷回來繼續執行之前的子程式,這個過程就稱為協程。類似與yield操作。協程的優點 無需執行緒切換上下文,避免了無意義的排程。...

python協程使用 協程的案例

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

python 協程實現與總結

我要把5個任務放到乙個執行緒裡面去 能不能發生併發操作 又乙個程序,切換到另乙個程序,由誰來操作的儲存狀態,由作業系統來 單執行緒可以實現併發,用協程 要找到一種解決方案,讓程式設計師應用程式的角度,找到解決方案,能實現執行乙個任務,切換乙個任務,在切換到另乙個任務,在切換之前把狀態儲存下來 單執行...