当前位置: 首页 > 工具软件 > asyncio > 使用案例 >

asyncio 控制并发

陶飞英
2023-12-01

asyncio控制并发

此文是在学习协程的过程中,对控制并发的方法的代码实现。
直接上代码:

# 导入asyncio协程库
import asyncio

# 初始化信号量,此处将其设为至多同时运行10个协程。
sem = asyncio.Semaphore(10)

# 定义协程函数,参数为:信号量,任务编号参数
async def run(sem, num):  
    async with sem:
        print("我的任务是第{}".format(num))
        # 此处模拟异步任务
        await asyncio.sleep(3)

# 启动协程
async def main():
    # 利用列表推导式产生1000个并发协程
    tasks = [run(sem, x) for x in range(1000)]
    # 交出控制,等待所有协程运行结束。
    await asyncio.wait(tasks)

if __name__ == '__main__':
    # 创建事件循环。
    event_loop = asyncio.get_event_loop()
    # 启动事件循环并等待协程main()结束。
    event_loop.run_until_complete(main())

下面是运行程序后的终端输出:

第一组 10 个协程执行开始。
我的任务是第305
我的任务是第646
我的任务是第987
我的任务是第306
我的任务是第647
我的任务是第988
我的任务是第307
我的任务是第648
我的任务是第989
我的任务是第308

第二组 10 个协程执行开始
我的任务是第649
我的任务是第990
我的任务是第309
我的任务是第650
我的任务是第991
我的任务是第310
我的任务是第651
我的任务是第992
我的任务是第311
我的任务是第652

第三组 10 个协程执行开始
我的任务是第993
我的任务是第312
我的任务是第653
我的任务是第994
我的任务是第313
我的任务是第654
我的任务是第995
我的任务是第314
我的任务是第655
我的任务是第996

......

核心代码

sem = asyncio.Semaphore(10)
此信号量将限制事件循环中并发的协程
数量,适当控制协程并发数可以避免过
占用大量的资源用于程序执行。

实验总结

在使用爬虫时,请一定要控制并发数量。
不要使用过大的并发协程数,避免对站
点造成不良影响。

 类似资料: