【问题标题】:Run a task at specific intervals in python [duplicate]在python中以特定间隔运行任务[重复]
【发布时间】:2010-11-05 13:13:54
【问题描述】:

可能重复:
Suggestions for a Cron like scheduler in Python?

安排函数作为后台任务定期运行的最 Pythonic 方式是什么?有一些想法here,但在我看来它们都相当难看。而且不完整。

javaTimer类有一个非常完整的解决方案。有人知道类似的python类吗?

【问题讨论】:

    标签: python timer


    【解决方案1】:

    有一个方便的事件调度程序可以满足您的需要。这是文档的链接:

    http://docs.python.org/library/sched.html

    【讨论】:

      【解决方案2】:

      试试multiprocessing 模块。

      from multiprocessing import Process
      import time
      
      def doWork():
          while True:
              print "working...."
              time.sleep(10)
      
      
      
      if __name__ == "__main__":
          p = Process(target=doWork)
          p.start()
      
          while True:
              time.sleep(60)
      

      【讨论】:

        【解决方案3】:

        许多程序员尽量避免使用多线程代码,因为它在命令式编程中很容易出错。

        如果您想在单线程环境中执行计划任务,那么您可能需要某种“Reactor”。你可能想使用像Twisted's 这样的现成的。

        那么它就是你的reactor提供的一个基本功能,例如(使用pygame):

        pygame.time.set_timer - 在事件队列中重复创建一个事件

        【讨论】:

        • “许多程序员试图避免使用多线程代码,因为它在命令式编程中很容易出错。”有点跑题了,但我不认为这是避免多线程的好理由。关键是要正确地做到这一点,并充分理解内存一致性和锁定语义。我同意这种类型的编程经验有限的程序员应该在生产代码中使用这种技术之前投入大量资金来学习和实践它。如果你想充分利用你的资源,在多核编程时代避免它并不是一个真正可行的选择。
        • @Scruffers 多线程很难正确处理(可能只是 hard to fix),除了线程之外还有许多其他方法可以使用多个内核
        【解决方案4】:

        不直接回答问题。

        在 Linux/Unix 操作系统上,这样做的方法很少,通常我只是正常编写程序/脚本,然后将其添加到 cron 或类似的东西(如 OS X 上的launchd

        从这里开始回答问题。

        使用标准 python sched 模块 - standard library documentation 描述了一些漂亮的解决方案。

        【讨论】:

        • 如果你使用一些“in Python”解决方案,你必须担心保持脚本运行(重启、崩溃等之后),cron 不需要这样做,并且非常简单可靠。
        【解决方案5】:

        Python 在线程模块中有一个 Timer 类,但它是一次性计时器,所以你最好按照你看到的链接做一些事情。 http://code.activestate.com/recipes/65222/

        你为什么觉得那很难看,一旦你写了这样一个类的用法就会像在java中一样简单。

        如果您在某些 GUI 中使用它,例如wxPython 比它有 wx.Timer ,你可以直接使用

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-03-11
          • 2012-11-18
          • 2014-02-15
          • 2016-04-04
          • 2019-08-02
          • 2021-04-15
          • 1970-01-01
          相关资源
          最近更新 更多