Python 协程
什么是协程
协程(Coroutine)是一种计算机程序组件,一种协作式的多任务处理程序,允许不同入口点在不同位置暂停和恢复执行。与线程相比,协程更轻量级,占用资源更少,并且能够在同一线程内实现并发。
在Python中,协程是由生成器函数实现的。生成器函数在执行时会保存当前状态,并在需要的时候回复执行,这种特性使得生成器函数可以被用来实现协程。
创建协程
在Python3.5版本引入了asyncio
模块,通过async
和await
关键字可以定义异步函数和协程。下面是一个简单的协程示例:
import asyncio
async def my_coroutine():
print("Coroutine started")
await asyncio.sleep(2)
print("Coroutine finished")
asyncio.run(my_coroutine())
在上面的代码中,my_coroutine
函数前面加上async
关键字,表示这是一个异步函数,可以在其中使用await
关键字来等待异步操作的完成。asyncio.sleep(2)
是一个异步的等待操作,让协程暂停执行2秒钟。
运行协程
要在Python中运行协程,需要使用asyncio.run()
函数。在上面的示例中,我们通过asyncio.run(my_coroutine())
来运行my_coroutine
协程。
协程的并发
协程是轻量级的并发处理方式,在Python中可以使用asyncio
模块来实现协程的并发执行。下面是一个简单的示例,同时运行多个协程:
import asyncio
async def my_coroutine(name, seconds):
print(f"{name} started")
await asyncio.sleep(seconds)
print(f"{name} finished")
async def main():
await asyncio.gather(
my_coroutine("Coroutine 1", 2),
my_coroutine("Coroutine 2", 1)
)
asyncio.run(main())
在上面的示例中,asyncio.gather()
函数可以并发执行多个协程。main()
函数中同时运行了两个协程my_coroutine("Coroutine 1", 2)
和my_coroutine("Coroutine 2", 1)
,它们会在不同的时间结束。
协程的通信
协程之间可以通过队列、管道等方式进行通信。Python中的asyncio.Queue
可以用于在协程之间传递数据。下面是一个简单的示例:
import asyncio
async def producer(queue):
for i in range(5):
await asyncio.sleep(1)
await queue.put(i)
print(f"Produced: {i}")
async def consumer(queue):
while True:
item = await queue.get()
print(f"Consumed: {item}")
queue.task_done()
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())
在上面的示例中,producer
协程不断产生数据放入队列,consumer
协程则不断消费队列中的数据。通过asyncio.Queue
实现了两个协程之间的通信。
异步IO
协程常用于处理异步IO操作,比如网络请求、文件读写等场景。下面是一个使用协程进行异步网络请求的示例:
import asyncio
import aiohttp
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
url = "https://jsonplaceholder.typicode.com/posts/1"
html = await fetch(url)
print(html)
asyncio.run(main())
在上面的示例中,fetch
协程使用aiohttp
库进行异步网络请求,在main
函数中等待网络请求的完成并输出。
总结
通过以上介绍,我们了解了Python中协程的概念、创建方式、运行方式、并发处理、通信方式以及异步IO操作。协程是一种强大的并发处理方式,在适当的场景下能够大大提升程序的性能和效率。在编写Python程序时,可以考虑使用协程来处理异步任务,提升程序的并发能力。