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())
文章目录