协程和异步编程是Python/ target=_blank class=infotextkey>Python中处理并发和异步任务的重要概念 。协程是一种轻量级的并发编程方式,它允许程序在执行过程中暂停和恢复,以便处理其他任务 。异步编程模型则是基于协程的一种编程风格,它通过使用非阻塞的异步IO操作来提高程序的并发性能 。
Python中的异步编程主要依赖于`asyncio`模块 。`asyncio`提供了一套用于编写异步代码的工具和框架,包括协程、事件循环和异步IO操作等 。
代码示例:
1. 使用`async`和`awAIt`定义协程函数:
import asyncioasync def my_coroutine():await asyncio.sleep(1)print("Coroutine executed")asyncio.run(my_coroutine())
2. 使用`asyncio.create_task()`并发运行多个协程:
import asyncioasync def coroutine1():await asyncio.sleep(1)print("Coroutine 1 executed")async def coroutine2():await asyncio.sleep(2)print("Coroutine 2 executed")async def main():task1 = asyncio.create_task(coroutine1())task2 = asyncio.create_task(coroutine2())await asyncio.gather(task1, task2)asyncio.run(main())
3. 使用`asyncio.wait()`等待多个协程完成:
import asyncioasync def coroutine1():await asyncio.sleep(1)print("Coroutine 1 executed")async def coroutine2():await asyncio.sleep(2)print("Coroutine 2 executed")async def main():tasks = [coroutine1(), coroutine2()]done, pending = await asyncio.wait(tasks)for task in done:print(f"Task {task} completed")asyncio.run(main())
4. 使用`asyncio.Lock()`实现协程间的互斥访问:
import asyncioasync def counter(lock):async with lock:for _ in range(5):print("Counting")await asyncio.sleep(1)async def main():lock = asyncio.Lock()tasks = [counter(lock) for _ in range(3)]await asyncio.gather(*tasks)asyncio.run(main())
5. 使用`asyncio.Queue()`实现协程间的消息传递:
import asyncioasync def producer(queue):for i in range(5):await queue.put(i)print(f"Produced: {i}")await asyncio.sleep(1)async def consumer(queue):while True:item = await queue.get()print(f"Consumed: {item}")await asyncio.sleep(2)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, consumer_task)asyncio.run(main())
6. 使用`asyncio.TimeoutError`设置协程的超时:
import asyncioasync def my_coroutine():await asyncio.sleep(2)print("Coroutine executed")async def main():try:await asyncio.wait_for(my_coroutine(), timeout=1)except asyncio.TimeoutError:print("Coroutine timed out")asyncio.run(main())
7. 使用`asyncio.run_in_executor()`在协程中执行阻塞的同步操作:
import asynciodef sync_operation():# 阻塞的同步操作return "Sync result"async def main():loop = asyncio.get_running_loop()result = await loop.run_in_executor(None, sync_operation)print(f"Result: {result}")asyncio.run(main())
8. 使用`aiohttp`库进行异步HTTP请求:
import asyncioimport aiohttpasync def fetch_data(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:return await response.text()async def main():url = "https://api.example.com/data"data = await fetch_data(url)print(f"Data: {data}")asyncio.run(main())
9. 使用`asyncio.sleep()`模拟异步计时器:
import asyncioasync def timer(duration):await asyncio.sleep(duration)print(f"Timer finished after {duration} seconds")async def main():tasks = [timer(1), timer(2), timer(3)]await asyncio.gather(*tasks)asyncio.run(main())
10. 使用`asyncio`实现并发的文件IO操作:
import asyncioasync def read_file(file):async with asyncio.open_file(file, "r") as f:contents = await f.read()print(f"Read from {file}: {contents}")async def write_file(file, data):async with asyncio.open_file(file, "w") as f:await f.write(data)print(f"Wrote to {file}")async def main():file = "data.txt"await write_file(file, "Hello, world!")await read_file(file)asyncio.run(main())
这些场景代码展示了协程和异步编程的使用方式 。通过使用`asyncio`模块和相关的工具,我们可以轻松地编写并发和异步任务处理的代码,提高程序的性能和响应能力 。
【聊聊Python协程和异步编程】
推荐阅读
- Python GUI 新手入门教程:轻松构建图形用户界面
- 你知道 Python 其实自带了小型数据库吗
- 解密 Python 如何调用 Rust 编译生成的动态链接库
- 我们一起聊聊前端接口容灾
- 聊聊 Calico BGP容器网络实践
- 聊聊常见的限流算法有哪些?
- 在Python中什么场景下应该使用多进程和多线程?
- 深入探索Python itertools库的五大常用方法
- Python中的协程,你知道怎么用吗
- Python Pandas数据预处理:你知道数据标准化吗?