限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: muyang-0410
现在有一个小功能需要实现:已经准备了一个或者多个文本文件,links.log,文件中的每一行都是一个下载命令,比如wget 这样子,一共有上千行。
也就是我们需要下载上千个mp3文件asyncio,逐个逐个去执行当然是可以的asyncio,但是何不趁机学习一下呢。
经过搜索发现可以使用的信号量这个功能来实现对并发数量的控制,这样就不至于一下子开了太多任务导致机器卡死,网卡打满,或者一下子开的太少导致总体耗时太久。
实战中使用的是并发数为4,这台M1 Pro头一次启动了自己的风扇,一直以为它风扇坏掉了。。。
import asyncio
import subprocess
async def run_command(command):
process = await asyncio.create_subprocess_shell(command)
await process.wait()
print(f'Command "{command}" finished with exit code {process.returncode}')
async def run_commands(commands):
# 创建一个限制并发数为4的信号量
sem = asyncio.Semaphore(4)
# 创建命令执行任务列表
tasks = []
for command in commands:
# 使用信号量限制并发数
async with sem:
task = asyncio.ensure_future(run_command(command))
tasks.append(task)
# 等待所有命令执行完成
await asyncio.gather(*tasks)
if __name__ == '__main__':
# 假设有100个下载任务
link_files = ["links.log"]
cmds = set()
# 这里补充你的cmds即可
loop = asyncio.get_event_loop()
loop.run_until_complete(run_commands(cmds))
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: muyang-0410
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,请联系我们进行处理。