【问题标题】:Python periodic task inside an infinite loop无限循环内的Python定期任务
【发布时间】:2014-11-15 10:58:16
【问题描述】:

我需要在while True 循环中每隔 5 秒执行一段代码。我知道 threading.Timer(5, foo).start() 将每 5 秒运行一次,但我的 foo() 函数取决于我的 while 循环中的一个变量。

foo 实际上是在另一个线程上运行的,我不想仅仅为了计时而阻塞当前线程。

+------------------------while #main-thread---------------------------------
|
+..........foo(val)..........foo(val)...........foo(val)............foo(val)
    -5s-              -5s-               -5s-               -5s- 

类似这样的:

def input(self):
      vals = []
      while True:
           # fill the vals
           # run `foo(vals)` every 5 seconds

def foo(vals):
    print vals

有没有 Pythonic 的方式来做到这一点?

【问题讨论】:

  • 使用 time.sleep(5) 停止执行 5 秒
  • 您的示例代码可能过于简化。该变量可以从另一个胎面访问,但如果这样做可能会导致问题。您必须以某种方式同步对两个线程使用的变量的访问。但是如何做到这一点没有一般规则,因为这在很大程度上取决于您对变量的实际操作。

标签: python python-2.7 scheduled-tasks timer-jobs


【解决方案1】:

使用sleep函数:

import time
def input(self):
      vals = []
      while True:
           # fill the vals
           foo(vals)
           time.sleep(5)

def foo(vals):
    print vals

请注意,仅当运行它所需的时间本身可以忽略不计时,该命令才会每 5 秒运行一次。

【讨论】:

  • 谢谢,但foo 实际上是在另一个线程上运行的,我不想阻塞当前线程。你有什么想法吗?
  • 每个线程中都有一个while True?一个在主线程中用于任何目的,一个在另一个线程中用于foosleep
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 2014-11-06
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
相关资源
最近更新 更多