python3 协程 async await用法
Python 3 中的协程是异步编程的一种形式,它允许您在代码中创建可暂停的函数,以便其他任务可以运行,而不会阻塞程序的执行。async/await 是 Python 3.5 之后引入的语法,用于编写协程。
下面是一些协程和 async/await 的用法示例:
- 使用 async 关键字定义协程函数
import asyncio async def my_coroutine(): print('Coroutine started') await asyncio.sleep(1) print('Coroutine ended') loop = asyncio.get_event_loop() loop.run_until_complete(my_coroutine())
上面的代码定义了一个协程函数 my_coroutine(),它在开始时打印一条消息,等待 1 秒钟,然后打印另一条消息。我们使用 asyncio.sleep() 函数来模拟延迟。
- 使用 asyncio.gather() 并行运行多个协程
import asyncio async def coroutine_one(): print('Coroutine one started') await asyncio.sleep(1) print('Coroutine one ended') async def coroutine_two(): print('Coroutine two started') await asyncio.sleep(2) print('Coroutine two ended') async def main(): tasks = [coroutine_one(), coroutine_two()] await asyncio.gather(*tasks) loop = asyncio.get_event_loop() loop.run_until_complete(main())
上面的代码定义了三个协程函数:coroutine_one()、coroutine_two() 和 main()。main() 函数并行运行 coroutine_one() 和 coroutine_two() 协程函数,我们使用 asyncio.gather() 函数来等待所有协程完成。
- 使用 asyncio.Queue() 传递消息
import asyncio async def producer(queue): print('Producer started') for i in range(5): await asyncio.sleep(1) await queue.put(i) await queue.put(None) print('Producer ended') async def consumer(queue): print('Consumer started') while True: item = await queue.get() if item is None: queue.task_done() break print(f'Consumed {item}') await asyncio.sleep(0.5) queue.task_done() print('Consumer ended') async def main(): queue = asyncio.Queue() producer_task = asyncio.create_task(producer(queue)) consumer_task = asyncio.create_task(consumer(queue)) await asyncio.gather(producer_task) await queue.join() await consumer_task loop = asyncio.get_event_loop() loop.run_until_complete(main())
上面的代码定义了三个协程函数:producer()、consumer() 和 main()。producer() 协程函数将数字放入队列中,并在最后放置一个 None,以表示它已经完成了它的工作。consumer() 协程函数从队列中获取项目并打印它们,直到它遇到 None。main() 函数创建了一个队列,运行了 producer() 和 consumer() 协程函数,并使用 asyncio.gather() 函数等待 producer() 完成。当队列为空时,我们使用 await queue.join() 等待所有项目被处理。最后,我们等待 consumer() 协程函数完成。
这些示例只是一些使用 async/await 实现协程的简单示例,您可以根据需要修改和扩展它们。
浙公网安备 33010602011771号