python 协程 asyncio
协程是一种计算机程序组件,它可以在执行过程中暂停和恢复。与线程或进程不同,协程是在程序内部控制的,并且没有操作系统的干预。协程通过在代码中插入特殊的挂起和恢复点,可以让程序在不同部分之间切换执行,实现高效的并发和异步编程。
协程的特点包括:
轻量级:协程的创建和切换开销很小,可以在同一个线程中创建大量的协程。 显式控制:协程的切换是由程序员手动控制的,可以在适当的时候挂起和恢复协程的执行。 高效性:由于没有线程切换的开销,协程可以实现更高效的并发和异步编程,提高程序的性能。 灵活性:协程可以在不同的任务之间切换执行,可以实现复杂的逻辑和流程控制。 在Python中,协程通过asyncio模块来实现。使用async和await关键字可以定义协程函数,通过await关键字可以挂起协程的执行,等待其他协程的完成。协程函数可以通过asyncio.create_task函数创建并发执行的任务,也可以通过asyncio.gather函数并发执行多个协程任务。协程可以利用事件循环机制来实现异步的IO操作,提高程序的效率和响应性。
我个人的理解是只要在函数前面加了async,就说明这个函数会被异步调用,就是以协程的方式异步调用。
await就是说这个函数是异步函数要想获取这个函数的返回值就要等一等。但是如果整个线程都在这里死等,会浪费运算资源,所以,await就可以先像进程一样挂起来,等那边结果返回了,再触发继续运行的事件。
如果用来验证的话可以这样写一个代码:
import asyncio
import time
import asyncio
async def worker(semaphore, task_name):
# 等待获取资源
async with semaphore:
print(f'{task_name} 获取到资源')
# 模拟执行任务
await asyncio.sleep(1)
print(f'{task_name} 完成任务')
async def main():
# 创建一个Semaphore对象,设置可同时获取资源的数量为2
semaphore = asyncio.Semaphore(2)
# 创建多个任务
tasks = [
asyncio.create_task(worker(semaphore, '任务1')),
asyncio.create_task(worker(semaphore, '任务2')),
asyncio.create_task(worker(semaphore, '任务3')),
asyncio.create_task(worker(semaphore, '任务4')),
]
# 等待所有任务完成
await asyncio.gather(*tasks)
# 运行主函数
asyncio.run(main())