【问题标题】:Cronjob at given interval给定时间间隔的 Cronjob
【发布时间】:2014-03-12 17:50:09
【问题描述】:

我有一个在树莓上加载网页的 python 脚本。

此脚本必须在启动时运行,然后每 15 分钟运行一次。将来会有很多这样的,可能有1000个甚至更多。目前我正在使用 cronjob 执行此操作,但问题是所有 1000 个覆盆子将同时连接到网页(加上减去几秒钟,因为它们从网络上获取精确的时钟)在最后一次运行后 15 分钟后执行命令,无论时间如何。我喜欢 cronjob 解决方案,因为我没有在后台运行任何东西,所以它只是执行它的工作,然后就结束了。

另一方面,cronjob 只关心分钟,而不是秒,所以即使我在这 15 分钟内分散了 1000 个 pi,我仍然会每分钟对网页同时收到大约 80 个请求。

有什么好的解决办法吗?

【问题讨论】:

    标签: python cron raspberry-pi


    【解决方案1】:

    在执行命令之前,您始终可以将 unix 命令 sleep xx 添加到 cronjob。

    示例:*/15 * * * * (sleep 20; /root/crontabjob.sh)

    现在作业将每 15 分 20 秒运行一次(00:15:20、00:30:20)、00:45:20 ....)

    【讨论】:

      【解决方案2】:

      您可以使用 time 模块在 python 中完全实现这一点:

      import time
      
      def main():
          while True:
              # Save time before starting
              start = time.time()
              # Run you job
              do_task()
              # Estimate how much time the task took (end-start)
              delay = time.time()-start
              # Wait for next 15 mins (counted from start, not from end)
              time.sleep((15*60)-delay)
      
      if __name__ == "__main__":
          main()
      

      等待sleep() 的脚本不应占用太多 CPU(如果有)。可能是循环仍然在很长一段时间内缓慢时移,但对于网络抓取来说可能是可以接受的。

      【讨论】:

      • 谢谢!它不必是 15 分钟,可以是 10 到 20 分钟之间的任何时间,所以没关系.. 感谢您的回答!为什么需要 def main()?
      • main() 不是必需的,将逻辑封装在函数中只是一个好习惯。它允许轻松重用您的代码。我将在示例中添加一些代码以便更好地理解。
      猜你喜欢
      • 2023-04-10
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 2018-07-27
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多