【问题标题】:How to have python execute a script every x hours without using cron?如何让 python 在不使用 cron 的情况下每 x 小时执行一次脚本?
【发布时间】:2012-12-10 01:31:28
【问题描述】:

我如何拥有一个包含函数(如 function1、function2 和 function3)的 python 脚本,我希望每 24 小时执行一次作为单独的进程/线程?所以说...

主应用程序执行function1,function2 function1 和 function2 在与主应用程序不同的线程中执行一些长时间运行的进程 一旦函数 1 完成其任务,向主应用程序报告它已完成

主应用程序打印“Done with Function 1”。 一旦函数 2 完成其任务,向主应用程序报告它已完成

功能 1 完成 24 小时后...主应用程序将再次执行它 函数 2 完成 6 小时后......主应用程序将再次执行该函数

请注意,这些函数会做类似的事情,但数据源不同,因此不希望有单独的应用程序并执行 cron。 例子会很棒。

【问题讨论】:

  • 你试过import time吗?
  • 应用程序如何将“执行函数作为一个单独的进程执行,该进程会报告给主应用程序(执行程序),然后它会知道何时开始计数以进行另一次更新。请注意,我会不希望为此使用 cron。”
  • 你可能想试试Advanced Python Scheduler
  • 为什么你不想要cron这个?有什么它不能做的事情是你需要的吗?如果是这样,您是否考虑过其他可以做到的调度程序?或者您是否在某种没有底层操作系统的仅限嵌入式 Python 的系统上运行?或者是什么? “拥有独立的应用程序”并不是一个真正的问题——独立的应用程序都可以与所有这些“功能......做类似的事情”共享一个模块。

标签: python


【解决方案1】:

如果您在应用程序中需要它,alarm() 是一个很好的起点,处理程序应该关闭fork()。如果您需要在不同的时间间隔同步不同的功能,PriorityQueue 很棒,因为您只能维护一个警报。 the docs 中有一个有效的 alarm() 示例。

否则,我可能会使用单独的应用程序,而不是函数,并通过crontab 触发它们。

【讨论】:

  • +1,实际上,cron 可能是 OP 想要的,尽管他说了什么……但是一点点:我建议使用 multiprocessing 而不是 fork,尤其是如果您想“向主应用报告”。
  • @abarnert: 嗯,我想我是老派 :P 我不知道multiprocessing,但它看起来像是fork() 的包装器,添加了一些细节(比如@ 的界面987654332@)。 (我不是 Pythonista,所以我不知道所有的库。)但是,OP 说他只想“完成 function1”,fork() + SIGCHLD 就足够了。
  • 好吧,除了它可以在 Windows 等非 POSIX 平台或没有 SysV shmem 的 POSIX 平台上工作之外,它还可以与多计算机网格一起使用,让您实际上将 Python 对象放在共享内存中(尝试做手动的——我想这就是我失去头发的原因……),并抽象了许多其他本来会很复杂的东西,是的,我想你可以说它只是 fork() 的包装。但是由于它抽象的一个复杂的事情是从分叉函数返回一个值,而 OP 专门要求这样做,并且可能不知道如何自己做......
  • PS,正如我所说,我对你的回答做了 +1,我并不是想说你不能用 os.fork 或任何东西正确地实现这个,只是我没想到考虑到他的问题所暗示的知识水平,OP 能够做到这一点,这就是我推荐multiprocessing 的原因。
  • @abarnert:不,不要误解我,multiprocessing 可能是更好的方式。我只是不知道,感谢您向我指出。 (显然,正如我所指出的,除了multiprocessing 之外,Python 似乎没有“独立”shmem 绑定,也许还有其他一些细节。)
【解决方案2】:

为什么要把它设置成一个每小时启动线程的应用程序?为什么不做一个简单的 cron 作业(或者如果你在 MS 机器上,类似的东西),每个函数都将其“使用 functionX 完成”写入日志文件。

你的 crontab 看起来像:

0 0 * * * function1.py >> log1
0 0 * * * function2.py >> log2

如果你的脚本中有一个 shebang。如果不是,请将“function1.py”替换为“python function1.py”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-14
    • 2011-07-20
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    相关资源
    最近更新 更多