Python協程(Coroutine)是一種輕量級的線程,它可以在執行過程中掛起并在稍后恢復。協程在異步編程和并發處理中非常有用。以下是一些使用Python協程的技巧:
async def
定義協程函數:協程函數使用async def
關鍵字定義,而不是普通的def
。async def my_coroutine():
print("Hello, coroutine!")
await
關鍵字調用協程:在協程函數內部,使用await
關鍵字調用其他協程函數或異步操作。這會讓當前協程掛起,直到被調用的協程完成。async def main():
await my_coroutine()
asyncio.run()
啟動協程:asyncio.run()
函數用于運行頂層的協程,并等待其完成。這是啟動協程的推薦方式。import asyncio
async def main():
await my_coroutine()
asyncio.run(main())
asyncio.gather()
并發運行多個協程:asyncio.gather()
函數接受一個協程列表,并并發運行它們。當所有協程完成時,它返回一個包含所有協程結果的列表。import asyncio
async def my_coroutine(n):
await asyncio.sleep(n)
return n
async def main():
coroutines = [my_coroutine(i) for i in range(5)]
results = await asyncio.gather(*coroutines)
print(results)
asyncio.run(main())
asyncio.Queue()
進行協程間通信:asyncio.Queue()
類用于在協程之間傳遞數據。生產者協程將數據放入隊列,消費者協程從隊列中取出數據。import asyncio
async def producer(queue):
for i in range(5):
await queue.put(i)
await asyncio.sleep(1)
async def consumer(queue):
while True:
item = await queue.get()
if item is None:
break
print(f"Consumed {item}")
queue.task_done()
async def main():
queue = asyncio.Queue()
prod_task = asyncio.create_task(producer(queue))
cons_task = asyncio.create_task(consumer(queue))
await prod_task
queue.join()
cons_task.cancel()
try:
await cons_task
except asyncio.CancelledError:
pass
asyncio.run(main())
asyncio.Semaphore()
限制并發協程數量:asyncio.Semaphore()
類用于限制同時運行的協程數量。協程在嘗試獲取信號量時會被掛起,直到信號量可用。import asyncio
async def my_coroutine(semaphore, n):
async with semaphore:
print(f"Coroutine {n} started")
await asyncio.sleep(1)
print(f"Coroutine {n} finished")
async def main():
semaphore = asyncio.Semaphore(3)
coroutines = [my_coroutine(semaphore, i) for i in range(10)]
await asyncio.gather(*coroutines)
asyncio.run(main())
這些技巧可以幫助你更有效地使用Python協程進行異步編程和并發處理。