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协程进行异步编程和并发处理。