在Python中,協(xié)程是實(shí)現(xiàn)并發(fā)處理的一種有效方式。協(xié)程允許你在一個(gè)函數(shù)執(zhí)行過(guò)程中掛起(yield),然后在稍后的時(shí)間點(diǎn)從同一位置恢復(fù)執(zhí)行(resume)。這使得你可以在單個(gè)線程中同時(shí)處理多個(gè)任務(wù),而無(wú)需多線程或多進(jìn)程的開(kāi)銷(xiāo)。
要實(shí)現(xiàn)協(xié)程并發(fā)處理,你可以使用asyncio
庫(kù),它是Python 3.4及更高版本中的標(biāo)準(zhǔn)庫(kù)。以下是一個(gè)簡(jiǎn)單的示例,展示了如何使用asyncio
協(xié)程實(shí)現(xiàn)并發(fā)處理:
import asyncio
async def task(name, seconds):
print(f"{name} 開(kāi)始執(zhí)行")
await asyncio.sleep(seconds)
print(f"{name} 執(zhí)行完成")
async def main():
# 創(chuàng)建任務(wù)列表
tasks = [
asyncio.create_task(task("A", 1)),
asyncio.create_task(task("B", 2)),
asyncio.create_task(task("C", 3)),
]
# 等待所有任務(wù)完成
await asyncio.gather(*tasks)
# 運(yùn)行事件循環(huán)
asyncio.run(main())
在這個(gè)示例中,我們定義了一個(gè)名為task
的協(xié)程函數(shù),它接受一個(gè)名稱和一個(gè)秒數(shù)作為參數(shù)。在函數(shù)內(nèi)部,我們使用await asyncio.sleep(seconds)
掛起協(xié)程執(zhí)行指定的秒數(shù)。然后,我們定義了一個(gè)名為main
的協(xié)程函數(shù),用于創(chuàng)建和管理任務(wù)列表。最后,我們使用asyncio.run(main())
啟動(dòng)事件循環(huán)并運(yùn)行main
協(xié)程。
當(dāng)你運(yùn)行這個(gè)程序時(shí),你會(huì)看到A、B和C三個(gè)任務(wù)并發(fā)執(zhí)行。盡管它們的執(zhí)行順序可能不同,但它們的總執(zhí)行時(shí)間仍然是3秒(B任務(wù)等待2秒,C任務(wù)等待3秒)。這就是協(xié)程實(shí)現(xiàn)并發(fā)處理的優(yōu)勢(shì)。