每隔N秒实时在线程中执行函数

Rya*_*ing 15 python multithreading real-time

我有一个线程类,其循环需要每秒执行4次.我知道我可以做类似的事情

do_stuff()
time.sleep(0.25)
Run Code Online (Sandbox Code Playgroud)

但问题是,这是不考虑所需的时间do_stuff().实际上,这需要是一个实时线程.有没有办法实现这个目标?理想情况下,线程在不执行代码时仍会处于休眠状态.

Fil*_*efp 40

简单的解决方案

import threading

def work (): 
  threading.Timer(0.25, work).start ()
  print "stackoverflow"

work ()
Run Code Online (Sandbox Code Playgroud)

以上将确保work以每秒四次的间隔运行,其背后的理论是,它将"排队"一个将在未来0.25秒运行的自身呼叫,而不会等待这种情况发生.

因此,它可以(几乎)完全不间断地工作,并且我们非常接近每秒执行4次功能.


threading.Timer可以通过以下链接到python文档来阅读更多关于:


推荐]更先进/动态的解决方案

即使前一个函数按预期工作,您也可以创建一个辅助函数来帮助处理未来的定时事件.

对于这个例子,下面的内容就足够了,希望代码能够说明一切 - 它不像它看起来那么先进.

当您可以实现自己的包装器以满足您的确切需求时,请将此视为灵感.

import threading

def do_every (interval, worker_func, iterations = 0):
  if iterations != 1:
    threading.Timer (
      interval,
      do_every, [interval, worker_func, 0 if iterations == 0 else iterations-1]
    ).start ()

  worker_func ()

def print_hw ():
  print "hello world"

def print_so ():
  print "stackoverflow"


# call print_so every second, 5 times total
do_every (1, print_so, 5)

# call print_hw two times per second, forever
do_every (0.5, print_hw)
Run Code Online (Sandbox Code Playgroud)

  • 看起来不错,但如何阻止这个? (6认同)