如何让Python schedule定时触发时遍历执行所有用户任务
问题描述
需要实现的逻辑:维护一个用户列表,让列表内用户按规则执行不同任务,所有用户的任务需要在指定定时时间启动。
当前异常表现:不使用schedule库时代码运行逻辑符合预期;接入schedule库后,定时时间到达时仅输出单个用户的执行结果,需要等到下一次定时触发才会输出下一个用户的结果。
预期效果:设定的定时时间到达时,代码能够遍历所有用户,依次输出所有用户的姓名及对应的活动,而非每次定时触发仅执行单个用户的任务。
原问题代码
import random import schedule as s import time Activities = ['eating', 'coding', 'praying', 'reading'] class now: def __init__(self, name): self.name = name def get_name(self): return self.name def start(self): print('My name is', self.name) a = random.choice(Activities) if a == 'eating': print('i am eating..') elif a == 'coding': print('I am coding') elif a == 'praying': print('I am praying') else: print('I am visit: reading') user1 = now('king') user2 = now('chibuike') user3 = now('ogodo') user4 = now('kingsley') user5 = now('sunday') user6 = now('success') user7 = now('emeka') user8 = now('jekwu') user9 = now('obinna') all = [user1, user2, user3,user4, user5, user6, user7, user8, user9] random.shuffle(all) for i in all: s.every().day.at("13:11").do(i.start) while True: s.run_pending()
错误原因
- 核心逻辑错误:
while True调度循环写在了遍历用户的for循环内部,第一次迭代给第一个用户注册完定时任务后,代码就直接进入死循环运行调度,后续8个用户的任务根本没有被注册到调度器中,每次定时触发自然只会执行已注册的单个用户任务。 - 编码不规范:类名
now语义不明,变量名all和Python内置函数重名,容易引发隐性bug;调度循环没有加休眠,会导致CPU空转占用过高。 - 任务设计不合理:循环给每个用户单独注册同一时间点的定时任务,逻辑冗余,不利于后续维护。
修正后代码
import random import schedule as s import time Activities = ['eating', 'coding', 'praying', 'reading'] class User: def __init__(self, name): self.name = name def get_name(self): return self.name def start(self): print('My name is', self.name) a = random.choice(Activities) if a == 'eating': print('i am eating..') elif a == 'coding': print('I am coding') elif a == 'praying': print('I am praying') else: print('I am visit: reading') user1 = User('king') user2 = User('chibuike') user3 = User('ogodo') user4 = User('kingsley') user5 = User('sunday') user6 = User('success') user7 = User('emeka') user8 = User('jekwu') user9 = User('obinna') user_list = [user1, user2, user3, user4, user5, user6, user7, user8, user9] random.shuffle(user_list) def run_all_tasks(): for user in user_list: user.start() # 注册单个批量执行的定时任务即可 s.every().day.at("13:11").do(run_all_tasks) # 所有任务注册完成后再启动调度循环 while True: s.run_pending() time.sleep(1)
修正点说明
- 将
while True调度循环移到所有任务注册逻辑的最外层,保证所有任务都能被正常注册到调度器 - 新增统一的批量执行函数,定时触发时直接在函数内部遍历打乱后的用户列表依次执行任务,完全匹配到点一次性跑完所有用户任务的需求
- 修正不规范命名:将语义不明的类名
now改为User,将和内置函数重名的变量all改为user_list,避免隐性bug - 在调度循环中增加1秒休眠,避免无意义的高频循环占用过多CPU资源
内容的提问来源于stack exchange,提问作者chibuike ogodo
相关产品推荐
相关产品推荐

