中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python協程怎么實現

發布時間:2023-03-31 17:08:38 來源:億速云 閱讀:110 作者:iii 欄目:開發技術

這篇文章主要講解了“Python協程怎么實現”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python協程怎么實現”吧!

1.協程

協程不是計算機提供的,計算機只提供:進程、線程。協程時人工創造的一種用戶態切換的微進程,使用一個線程去來回切換多個進程

實現協程的幾種方法

  • greenlet:早期模塊

  • yield關鍵字:可以保存代碼,保存狀態

  • asyncio裝飾器(3.4)

  • async、await關鍵字(3.5)【推薦】

1.1greenlet實現協程

pip install greenlet

from greenlet import greenlet
def fun1():
  gre2.switch()#切換到fun2
  pass
def fun2():
  gre1.switch()#切換到fun1
  pass
gre1 = greenlet(func1)
gre2 = greenlet(func2)
gre1.switch()#先去執行fun1

1.2yield關鍵字實現協程

def func1():
    yield 1
    yield from func2()
    yield 2
    
def func2():
    yield 3
    yield 4
f1 = func1()
for item in f1:
    print(item,end=" ")
    
#打印結果
1 3 4 2

1.3使用asyncio模塊實現協程

再python3.4版本之后才可以用(不用安裝,在標準庫中)

import asyncio
#使用該裝飾器裝飾后,該函數就是一個協程函數
@asyncio.coroutine
def func1():
    print(1)
    #遇到IO操作時,會自動切換到taks中的其他任務函數
    yield from asyncio.sleep(2)
    print(2)

@asyncio.coroutine
def func2():
    print(3)
    yield from asyncio.sleep(2)
    print(4)
    
#將兩個協程函數封裝成一個tasks列表
tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())
]
#
loop = asyncio.get_event_loop()
loop.run_until_complete(func1())

1.4async & await關鍵字實現協程

import asyncio
#使用該裝飾器裝飾后,該函數就是一個協程函數

async def func1():
    print(1)
    #遇到IO操作時,會自動切換到tasks中的其他任務函數
    await asyncio.sleep(2)
    print(2)


async def func2():
    print(3)
    await asyncio.sleep(2)
    print(4)
    
#將兩個協程函數封裝成一個tasks列表
tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())
]

loop = asyncio.get_event_loop()
loop.run_until_complete(tasks)

2.協程意義

在線程中如果遇到IO等待時間,線程不會傻等著,會利用空閑的時間去做其他事情,也就是進程異步執行。

#協程請求資源使用第三方庫aiohttp
import aiohttp

3.異步編程

3.1時間循環

理解成一個死循環,去檢測并執行某些代碼

#偽代碼
任務列表 = [task1,task2...]
while True:
  for 就緒任務 in 可執行任務列表:
    執行
  for 已完成任務 in 已完成任務列表:
    從任務列表中刪除

import asyncio 

#生成一個書簡循環
loop = asyncio.get_event_loop()
#將任務放到任務列表中
loop.run_until_complete(任務)

3.2案例

協程函數,

定義函數的時候,用async def 函數名

協程對象:執行協程函數的時候得到一個協程對象

async def func():
  pass
result = func()

注意:執行協程函數時得到的協程對象,函數內部代碼不會執行

import asyncio
async def func():
  print("哈嘍")

f = func()#協程對象

loop = asyncio.get_event_loop()#創建循環對象
loop.run_until_complete(f)#通過循環對象執行協程對象

#python3.7可以直接
asyncio.run(f)

3.3await關鍵字

await + 可等待的對象 {協程對象,Future對象,Task對象} (類似于I O 等待)

import asyncio
async def func():
  print("哈嘍")
  re = await asyncio.sleep(2)
	print(re)
asyncio.run(func())

await就是等待對象的值得到結果后再繼續向下執行

import asyncio
async def other():
  print("start")
  await asyncio.sleep(2)
  print("end")
  return 1

async def fun():
  print("執行協程函數內部代碼")
  #遇到IO操作時會掛起當前協程任務,等IO操作完成后再繼續往下執行,當前協程掛起時,時間循環對象可以執行其他協程任務
  re = await other()
  print("IO請求結束,結果為:",re)
  
asyncio.run(func())

執行結果 

執行協程函數內部代碼
start
end
IO請求結束,結果為: 1

感謝各位的閱讀,以上就是“Python協程怎么實現”的內容了,經過本文的學習后,相信大家對Python協程怎么實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

清远市| 延安市| 马尔康县| 泰宁县| 五常市| 抚松县| 遵化市| 昂仁县| 苍溪县| 乐清市| 韩城市| 蓬莱市| 玛曲县| 厦门市| 玉林市| 屏东县| 禹城市| 深圳市| 甘肃省| 阳谷县| 揭西县| 京山县| 武胜县| 田东县| 凭祥市| 新兴县| 遂平县| 郑州市| 松溪县| 莱西市| 泰兴市| 鄂温| 云梦县| 永新县| 昌平区| 岐山县| 清流县| 陇南市| 赫章县| 桐城市| 奎屯市|