定期执行函数/SIGSTOP

Periodically execute function / SIGSTOP

我想要 运行 一个项目 (project.py),它有两个调度元素,就像我在堆栈溢出时发现的这个答案:Periodically execute function in thread in real time, every N seconds

一个函数是 运行 每 x 秒,另一个每 y 秒 其中 0.03 < x < 0.12 < y < 10.

function_x(t) 调用暂停的外部程序 (sync.py) (SIGSTOP) project.py

问题0:调用do_every后,程序继续执行。这是一个正确的假设吗?

问题 1:如果 sync.py 在 project.py 上调用 SIGCONT 之前需要 2 秒执行,那么 function_x 的 Timer 会是 'messed up' 吗?

问题 3:如果 function_y 通过套接字发送数据,function_x 调用 SIGSTOP 会不会搞乱这个执行?计时会暂停吗?定时器是怎么计时的?

之前引用的答案:

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 "Whosebug"


# 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);

0) 调用 do_every 后 - 它运行 worker_func 一次然后继续。是的。所以你的输出将是:

Whosebug
After first do_every
hello world
After second do_every
hello world
Whosebug
....

1) 我真的不知道计时器是否会被搞砸 - 所以我 运行 使用 htop 进行测试,我可以在其中将 SIGCONT 和 SIGSTOP 发送到任何进程 - 所以,我 运行 do_every (2, print_so, 10); 并且在 5-6 "Whosebug"s 之后我停止了它。启动它一分钟后 - 它又喷出 4 个 Whosebug。所以,不 - 计时器没有搞砸。

3) 它不会被搞砸 - 如果套接字超时 - 并且你暂停超过超时时间,套接字的另一端将假定你的代码已死并会给出超时异常。但如果它的时间少于超时,套接字将假定它是一个临时断开连接,并在之后继续流式传输数据。