You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:01:18