You need to enable JavaScript to run this app. 如何用python schedule库调度Python列表内多输入的定时任务
优惠活动
大模型
产品
解决方案
定价
更多

如何用python schedule库调度Python列表内多输入的定时任务

问题根源
  • 调度逻辑参数传递错误:schedule.every(2).seconds.do(jobqueue.put, (job, name)) 这行代码会把整个name列表打包成(job, name列表)的元组,一次性放入队列。worker取出后直接把整个列表当入参传给job执行,自然会一次性输出所有内容。
  • 单worker线程在任务量大时容易造成队列堆积,可根据后续需求扩展多worker并发处理。
适配现有队列架构的修改方案

新增批量入队函数,调度触发时遍历输入列表,逐个把单个任务入队,修改后完整代码如下:

import queue
import time
import threading
import schedule

def job(name):
    print(name)


def worker_main():
    while 1:
        job_func, job_msg = jobqueue.get()
        job_func(job_msg)
        jobqueue.task_done()


def enqueue_tasks(input_list):
    # 遍历输入列表,逐个将单个任务入队
    for single_input in input_list:
        jobqueue.put((job, single_input))


if __name__ == "__main__":
    name = ['jane', 'alice', 'mary']
    jobqueue = queue.Queue()

    # 调度触发时执行批量入队逻辑
    schedule.every(2).seconds.do(enqueue_tasks, input_list=name)

    worker_thread = threading.Thread(target=worker_main, daemon=True)
    worker_thread.start()

    while 1:
        schedule.run_pending()
        time.sleep(1)
修改点说明
  • 新增enqueue_tasks函数:替代原来直接调用jobqueue.put的逻辑,调度触发后会遍历所有输入项,逐个把(job, 单个输入)的元组放入队列,避免一次性塞入整个列表。
  • 给worker线程添加daemon=True:主程序退出时worker线程会自动结束,不会残留后台进程。
  • 新增if __name__ == "__main__"入口:避免模块被导入时自动执行调度逻辑,符合Python代码规范。
轻量场景可选方案

如果不需要队列串行排队、任务量不大,也可以跳过队列直接给每个输入绑定独立调度,无需额外开worker线程:

for single_name in name:
    schedule.every(2).seconds.do(job, name=single_name)

该方案更轻量,schedule会直接在主循环中执行任务,适合对执行顺序没有强制要求的场景。


内容的提问来源于stack exchange,提问作者iEriii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 12:54:07