Python協(xié)程(coroutines)是一種輕量級的線程,它可以在執(zhí)行過程中掛起并在稍后恢復(fù)。協(xié)程非常適合用于異步編程,因?yàn)樗鼈冊试S你在等待某個(gè)操作完成時(shí)執(zhí)行其他任務(wù)。在Python中,協(xié)程主要通過async/await
語法和asyncio
庫來實(shí)現(xiàn)。
以下是使用協(xié)程簡化異步編程的一些方法:
使用async def
定義協(xié)程函數(shù):
在定義協(xié)程函數(shù)時(shí),需要在函數(shù)聲明前加上async def
關(guān)鍵字。這將告訴Python這是一個(gè)協(xié)程函數(shù),而不是一個(gè)普通的同步函數(shù)。
async def fetch_data():
# 異步操作
使用await
關(guān)鍵字調(diào)用協(xié)程函數(shù):
當(dāng)調(diào)用一個(gè)協(xié)程函數(shù)時(shí),需要使用await
關(guān)鍵字。這將掛起當(dāng)前協(xié)程的執(zhí)行,直到被調(diào)用的協(xié)程完成。這使得你可以在等待某個(gè)操作完成時(shí)執(zhí)行其他任務(wù)。
async def main():
data = await fetch_data()
print(data)
使用asyncio.run()
啟動協(xié)程:
asyncio.run()
函數(shù)是Python 3.7及更高版本中引入的一個(gè)便捷函數(shù),用于啟動并運(yùn)行頂層的協(xié)程。它將負(fù)責(zé)創(chuàng)建一個(gè)事件循環(huán),運(yùn)行協(xié)程,然后關(guān)閉事件循環(huán)。
import asyncio
async def main():
data = await fetch_data()
print(data)
asyncio.run(main())
使用asyncio.gather()
并發(fā)運(yùn)行多個(gè)協(xié)程:
如果你有多個(gè)協(xié)程需要同時(shí)運(yùn)行,可以使用asyncio.gather()
函數(shù)。這將返回一個(gè)包含所有協(xié)程結(jié)果的列表。
import asyncio
async def fetch_data_1():
# 異步操作
return "Data 1"
async def fetch_data_2():
# 異步操作
return "Data 2"
async def main():
data1, data2 = await asyncio.gather(fetch_data_1(), fetch_data_2())
print(data1, data2)
asyncio.run(main())
使用asyncio.wait()
等待一組協(xié)程完成:
如果你需要等待一組協(xié)程中的任意一個(gè)完成,可以使用asyncio.wait()
函數(shù)。這將返回兩個(gè)集合:已完成協(xié)程的集合和未完成協(xié)程的集合。
import asyncio
async def fetch_data_1():
# 異步操作
return "Data 1"
async def fetch_data_2():
# 異步操作
return "Data 2"
async def main():
data1, data2 = await asyncio.wait([fetch_data_1(), fetch_data_2()], return_when=asyncio.FIRST_COMPLETED)
print(data1[0], data2[0])
asyncio.run(main())
通過使用協(xié)程,你可以編寫出更簡潔、易讀的異步代碼,同時(shí)避免了回調(diào)地獄(callback hell)的問題。