如何用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
相关产品推荐
相关产品推荐

