非同步化框架一部分
協程詳解
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個任務放到乙個執行緒裡面去 能不能發生併發操作 又乙個程序,切換到另乙個程序,由誰來操作的儲存狀態,由作業系統來 單執行緒可以實現併發,用協程 要找到一種解決方案,讓程式設計師應用程式的角度,找到解決方案,能實現執行乙個任務,切換乙個任務,在切換到另乙個任務,在切換之前把狀態儲存下來 單執行...