【協程】協程概念
阿新 • • 發佈:2022-05-31
1、協程
- 協程不是計算機提供的,是由程式設計師人為的建立的
- 協程(Coroutine):也可以被稱為微執行緒,是一種使用者態內的上下文切換技術。簡而言之,其實就是通過一個執行緒實現程式碼塊相互切換執行。
2、實現協程的幾種方法
- greenlet
- yield關鍵字
- asyncio裝飾器(py3.4)
- async await關鍵字(py3.5)【推薦】
3、greenlet實現協程
pip3 install greenlet
from greenlet import greenlet def func1(): print(1) # 第二步,輸出1 gr2.switch() print(2) # 第四步,輸出2 gr2.switch() # 第六步,無輸出 def func2(): print(3) # 第三步,輸出3 gr1.switch() print(4) # 第五步,輸出4 gr1 = greenlet(func1) gr2 = greenlet(func2) gr1.switch() # 執行第一步
4、asyncio裝飾器實現協程
# -*- coding: utf-8 -*- import asyncio @asyncio.coroutine def func1(): print(1) yield from asyncio.sleep(2) # 通過IO耗時操作,自動化切換到tasks中的其他任務 print(3) @asyncio.coroutine def func2(): print(2) yield from asyncio.sleep(2) # 通過IO耗時操作,自動化切換到tasks中的其他任務 print(4) tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2()) ] loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks))
- 注意:遇到IO阻塞自動切換
5、async&await關鍵字【py3.5以後】
import asyncio async def func1(): print(1) await asyncio.sleep(2) # 通過IO耗時操作,自動化切換到tasks中的其他任務 print(3) async def func2(): print(2) await asyncio.sleep(2) # 通過IO耗時操作,自動化切換到tasks中的其他任務 print(4) tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2()) ] loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks))
- 注意:遇到IO阻塞自動切換