在Python中,实现协程并发主要是通过`asyncio`库来完成的。`asyncio`是Python 3.4中引入的标准库,用于编写单线程的并发代码。使用`async`和`await`关键字,你可以定义协程和等待其他协程的完成,而不需要创建额外的线程或进程。
下面是一个使用`asyncio`实现协程并发的例子:
```python
import asyncio
定义一个协程函数,模拟异步IO操作
async def fetch_data(url):
print(f'Fetching {url}...')
模拟网络延迟
await asyncio.sleep(1)
return f'Data from {url}'
定义一个主协程函数,用于并发地获取多个URL的数据
async def main():
创建一个任务列表
tasks = [
fetch_data('http://example.com/1'),
fetch_data('http://example.com/2'),
fetch_data('http://example.com/3')
]
使用asyncio.gather等待所有任务完成,并获取结果
results = await asyncio.gather(*tasks)
打印结果
for result in results:
print(result)
运行主协程
asyncio.run(main())
```
在这个例子中,`fetch_data`是一个协程函数,它模拟了从某个URL获取数据的异步操作(实际上是通过`asyncio.sleep(1)`来模拟网络延迟)。`main`函数是另一个协程,它创建了三个`fetch_data`协程的任务,并使用`asyncio.gather`来并发地运行这些任务。`asyncio.gather`会等待所有任务完成,并返回一个包含所有任务结果的列表。
最后,我们使用`asyncio.run(main())`来运行主协程。`asyncio.run`函数会创建一个事件循环,运行传入的协程,并在协程完成后关闭事件循环。
需要注意的是,虽然协程在逻辑上是并发的,但它们实际上是在单个线程中顺序执行的。`asyncio`库通过非阻塞的I/O操作(如网络请求、文件读写等)来实现并发,这意味着当协程等待I/O操作时,它会让出控制权,允许其他协程运行。这样,即使在单个线程中,也可以实现高效的并发处理。