Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每周一运行Python调度程序?_Python_Scheduler - Fatal编程技术网

每周一运行Python调度程序?

每周一运行Python调度程序?,python,scheduler,Python,Scheduler,我每周一上午10:00运行一个调度程序。代码如下: import schedule import time schedule.every().monday.at("10:00").do(job) while 1: schedule.run_pending() time.sleep(1) 我这里的问题是time.sleep()的值应该是7days=604800秒还是保持1秒? 有人能提供一个很好的例子,说明time.sleep()如何影响程序的执行,在这种

我每周一上午10:00运行一个调度程序。代码如下:

import schedule
import time

schedule.every().monday.at("10:00").do(job)

while 1:
    schedule.run_pending()
    time.sleep(1)
我这里的问题是time.sleep()的值应该是7days=604800秒还是保持1秒? 有人能提供一个很好的例子,说明time.sleep()如何影响程序的执行,在这种情况下,哪种方式更好:睡眠1秒或604800秒。提前感谢。

计划。run_pending()
只需在循环中连续运行所有到期的作业。带有睡眠的循环决定检查作业的频率,定义作业运行时的最小粒度

每秒钟进行一次投票是不礼貌的。除非CPU处于空闲状态,否则每次轮询都会中断其他一些任务,刷新内存缓存,通常会增加宇宙的熵。您可以通过更改睡眠设置不同的粒度。在本例中,每10分钟检查一次作业。所以可能是10:10,而不是10:00。这可能没问题,您中断系统的次数减少了600次。对于您的任务来说,每小时进行一次轮询也是合理的

JOB_GRANULARITY_SECONDS = 60 * 10

while True:
    schedule.run_pending()
    time.sleep(JOB_GRANULARITY_SECONDS)
但是,当两份工作之间存在着巨大的差距时,为什么不计算出确切的睡眠时间呢?你可以得到下一份工作的时间和睡眠量(也许可以用一个模糊因子来处理微小的波动,比如时钟的粒度和时间协议在一点额外的时间内的波动)。此示例具有2秒的捏造粒度

while True:
    schedule.run_pending()
    next_run_delta = (schedule.next_run - datetime.datetime.now()).total_seconds()
    if next_run_delta <= 0:
        continue
    time.sleep(next_run_delta + 2)
为True时:
schedule.run_pending()
next_run_delta=(schedule.next_run-datetime.datetime.now()).total_seconds()

如果您已经在使用cron,那么为什么要使用调度模块?只是运行这个作业。实际上它不是cron作业,它只是一个调度程序,它将根据我给出的脚本在每周一运行。我想你误解了这一点,因为我写的是cron作业而不是schedulerIf。如果这是生死攸关的问题,你必须使用schedule包进行调度,而不是使用操作系统提供的解决方案,那么根据时间。睡眠(1)应该这样做。这样做的目的是定期检查需要启动的作业,因此你需要每秒钟醒来一次。对于Linux,你有@aboudishukorth;对于windows,你有@aboudishukorth。这就是“时间表”的设计方式。没有其他方法,因此也没有更好的方法,比在这种情况下每一秒都醒来更好。例如,如果您在linux上运行,我建议您使用调度作业。谢谢您的回答。因此,在你看来,如果你的两份工作之间有很大的差距,最好的办法就是使用你写对的第二个代码?@AboudiShukor-是的。事实上,我很难找到一个投票更好的案例。谢谢。关于日程安排,我只有一个问题。下次跑步。你能给我举个例子吗?比如它将返回什么,基于什么返回这个datetime对象?它是基于我在调度程序中使用的日期(在本例中为星期一)还是确切地说是什么获取值?是的,
schedule
将作业的下一个计划时间转换为绝对
datetime.datetime
对象,并在作业运行时重新计算该时间。我们通过减去当前时间来计算到下一个作业的相对时间,然后等待那么久。现在,当我们运行作业时,会重新计算它们的日期时间,我们会得到一个新的
next\u run
等待。
while True:
    try:
        schedule.run_pending()
    except Exception as e:
        my_alert_fctn(f"Scheduler failed, {e}") # email maybe?
    next_run_delta = (schedule.next_run - datetime.datetime.now()).total_seconds()
    if next_run_delta < 0:
        continue
    time.sleep(next_run_delta + 2)