协程和异步编程是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`模块和相关的工具,我们可以轻松地编写并发和异步任务处理的代码,提高程序的性能和响应能力。
本文链接:http://www.28at.com/showinfo-26-35336-0.html我们一起聊聊Python协程和异步编程
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com