Ζℤ 2025-01-02 14:34 采纳率: 87.5%
浏览 16
已结题

如何优雅地实现一个动态任务队列调度器并控制并发任务数量?

在学习多线程和异步编程时,我遇到了一个实际问题。假设我需要处理一个任务列表(任务可能是下载文件、爬取网页等),而这些任务需要动态添加,同时又需要控制最大并发任务的数量(例如限制为5个)。请问应该如何设计一个动态任务队列调度器以满足以下需求:

可以动态添加任务;
支持控制最大并发任务数量;
任务的处理可以是同步或异步的;
处理完一个任务后会自动取下一个任务进行处理。
代码部分: 如果使用 threading 或 asyncio,如何实现这个调度器?请给出实现思路或关键代码。

问题相关的代码片段:

import asyncio

async def task(name, delay):
    print(f"Task {name} started")
    await asyncio.sleep(delay)
    print(f"Task {name} finished")

# 示例任务函数
tasks = [
    {"name": "Task 1", "delay": 2},
    {"name": "Task 2", "delay": 1},
    {"name": "Task 3", "delay": 3},
    {"name": "Task 4", "delay": 4},
]

# 请在这里实现调度器逻辑,满足上述需求。
  • 写回答

2条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2025-01-02 14:35
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    为了设计一个动态任务队列调度器来满足上述需求,可以采用以下思路:
    1. 创建一个任务队列,用来存储待执行的任务。
    2. 创建一个线程池或者使用 asyncio 来管理并发执行任务的数量,例如限制为5个。
    3. 实现一个函数来动态添加任务到任务队列,并在任务执行完毕后自动获取下一个任务进行处理。
    4. 根据任务的处理方式(同步或异步),调用合适的函数来执行任务的处理逻辑。 下面是一个示例代码,使用 asyncio 实现这个调度器:
    import asyncio
    async def task(name, delay):
        print(f"Task {name} started")
        await asyncio.sleep(delay)
        print(f"Task {name} finished")
    tasks = [
        {"name": "Task 1", "delay": 2},
        {"name": "Task 2", "delay": 1},
        {"name": "Task 3", "delay": 3},
        {"name": "Task 4", "delay": 4},
    ]
    async def task_scheduler(tasks):
        semaphore = asyncio.Semaphore(5)  # 控制最大并发任务数量为5
        async def worker(task):
            async with semaphore:
                await task(task["name"], task["delay"])
        
        for task_info in tasks:
            await worker(task_info)
    # 在主程序中调用 task_scheduler 函数来启动任务调度器
    asyncio.run(task_scheduler(tasks))
    

    在这个示例中,我们使用 asyncio.Semaphore 来限制最大并发任务数量为5。然后在 task_scheduler 函数中,我们通过创建 worker 函数来实现对任务的并发处理。通过运行 task_scheduler 函数,我们可以实现动态添加任务并控制最大并发任务数量的任务调度器。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月12日
  • 已采纳回答 1月4日
  • 创建了问题 1月2日