【问题标题】:Python schedule a function to run every few secondsPython安排一个函数每隔几秒运行一次
【发布时间】:2021-11-13 22:14:27
【问题描述】:

我是使用 python 的新手,我有一个包含 3 个函数的 python 代码。我想在每 X 秒后运行这三个函数。我正在使用 APScheduler 包和 add_job 方法。当我为一个函数实现时,我看到一条警告消息说“已跳过:已达到最大运行实例数 (1)”。那么,当我使用 add_job 方法调度所有三个函数时会发生什么?

代码看起来像这样

  scheduler1 = APScheduler()
scheduler2 = APScheduler()
scheduler3 = APScheduler()

def fun1():
  print("From Func1")

def fun2():
  print("From Func2")

def fun3():
  print("From Func3")


if __name__ == '__main__':
    scheduler1.add_job(id='Scheduled task', func=fun1, trigger='interval', seconds=5)
    scheduler.start()
    scheduler2.add_job(id='Scheduled task', func=fun2, trigger='interval', seconds=5)
    scheduler.start()
    scheduler3.add_job(id='Scheduled task', func=fun3, trigger='interval', seconds=5)
    scheduler.start()

使用上述类型的代码,我能否实现一个调度器在后台运行三个作业,并且所有这些作业每 5 秒运行一次?

【问题讨论】:

  • 为所有工作提供相同的 ID 看起来不正确。
  • 好的,警告消息“已跳过:已达到最大运行实例数 (1)”怎么样。这样好吗?我想知道这是否是安排函数每 5 秒运行一次的正确方法
  • 你有三个调度器。你只需要一个。创建一个调度程序,将每个作业添加到该调度程序,然后使用scheduler.start() 启动它。每次添加作业时无需运行 start,只需在最后执行即可。
  • 同样,此时,您的程序将在三个任务启动后结束。在末尾添加一个while True 循环,其中包含time.sleep(1),以保持代码运行。
  • @George 查看我对该答案的评论,和/或查看其他答案。

标签: python scheduled-tasks scheduling


【解决方案1】:

首先,您的代码没有任何问题,只是对象名称的愚蠢输入错误,而且显然没有优化。

以下是修正错别字后的版本

from apscheduler.schedulers.background import BackgroundScheduler
from time import sleep

scheduler1 = BackgroundScheduler()
scheduler2 = BackgroundScheduler()
scheduler3 = BackgroundScheduler()

def fun1():
  print("From Func1")

def fun2():
  print("From Func2")

def fun3():
  print("From Func3")


if __name__ == '__main__':
    scheduler1.add_job(id='Scheduled task', func=fun1, trigger='interval', seconds=5)
    scheduler1.start()
    scheduler2.add_job(id='Scheduled task', func=fun2, trigger='interval', seconds=5)
    scheduler2.start()
    scheduler3.add_job(id='Scheduled task', func=fun3, trigger='interval', seconds=5)
    scheduler3.start()
    while True:
        sleep(1)

我添加了额外的睡眠功能来阻止程序被杀死并测试计时器是否工作,它工作正常

以下版本是您的代码的优化形式

from apscheduler.schedulers.background import BackgroundScheduler
from time import sleep

scheduler = BackgroundScheduler()

def fun1():
  print("From Func1")

def fun2():
  print("From Func2")

def fun3():
  print("From Func3")


if __name__ == '__main__':
    scheduler.add_job(id='Scheduled task 1', func=fun1, trigger='interval', seconds=5)
    scheduler.add_job(id='Scheduled task 2', func=fun2, trigger='interval', seconds=5)
    scheduler.add_job(id='Scheduled task 3', func=fun3, trigger='interval', seconds=5)
    scheduler.start()
    while True:
        sleep(1)

使用单个调度器对象在指定时间段后运行所有功能。

【讨论】:

  • 此程序将在 20 秒后结束,任务将停止运行。您需要一个 while 循环来保持程序运行。
  • 感谢 Zain,您如何看待这条警告消息“已跳过:已达到最大运行实例数 (1)”?
  • 看起来你的硬件不支持这个数量的实例,因为我没有收到这样的警告我的规格是 Intel Core i5,第 8 代,16GB RAM,python 3.9
  • 我附上截图
  • 将此作为一个单独的问题提出,您必须将所有函数的引用存储在列表中以一次迭代并执行所有函数
【解决方案2】:

这行得通吗?

import time

scheduler = APScheduler()

def fun1():
  print("From Func1")

def fun2():
  print("From Func2")

def fun3():
  print("From Func3")


if __name__ == '__main__':
    while True:
        scheduler.add_job(id='Scheduled task', func=fun1, trigger='interval', seconds=5)
        scheduler.add_job(id='Scheduled task', func=fun2, trigger='interval', seconds=5)
        scheduler.add_job(id='Scheduled task', func=fun3, trigger='interval', seconds=5)
        scheduler.start()
        time.sleep(20)

它应该永远运行,直到你按下 Ctrl+c

你也可以这样试试

import time

scheduler = APScheduler()

def fun1():
  print("From Func1")

def fun2():
  print("From Func2")

def fun3():
  print("From Func3")

scheduler.add_job(id='Scheduled task', func=fun1, trigger='interval', seconds=5)
scheduler.add_job(id='Scheduled task', func=fun2, trigger='interval', seconds=5)
scheduler.add_job(id='Scheduled task', func=fun3, trigger='interval', seconds=5)
scheduler.start()

if __name__ == '__main__':
    while True:
        time.sleep(20)

这样,您只需将作业添加到调度程序一次,然后一遍又一遍地运行启动循环。

【讨论】:

  • 为什么要不断添加工作/一遍又一遍地重新开始?
  • 看第二个代码
  • 在第二个代码中,您不断地启动调度程序。它只需要启动一次。
  • 糟糕,谢谢
猜你喜欢
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 2012-07-14
  • 2018-11-18
  • 2015-04-28
  • 1970-01-01
  • 2021-04-17
相关资源
最近更新 更多