3

在能够立即终止执行程序(线程或进程)的同时以固定间隔连续重复执行给定函数的最佳方法是什么?

基本上我知道两种方法:

  1. 最后使用无限循环time.sleep的多处理和函数。处理process.terminate()以任何状态终止。
  2. 使用线程并在线程函数结束时不断重新创建计时器。timer.cancel()处理在睡眠时终止。

(“处于任何状态”和“睡觉时”都可以,即使后者可能不是即时的)。问题是我必须同时使用多处理和线程,因为后者似乎不适用于 ARM(python 解释器和 vim 的一些模糊交互,在 vim 之外一切都很好)(我在那里使用第二种方法,没有尝试过线程+循环;目前没有代码),前者产生了太多的进程,除非真的需要,否则我不想看到。这导致了一个问题,即必须编写两种不同的方法,而threading使用循环只是为了替换所有包含在/中的multiprocessing东西的直接替换(除了没有 )。有没有更好的方法来完成这项工作?ifelsethread.terminate()

当前使用的代码在这里(目前两个工作都有循环),但我认为回答这个问题不会有多大用处。

更新:我使用此解决方案的原因是在 vim 状态行的版本控制系统中显示文件状态(以及其他一些东西,如分支)的功能。这些状态必须更新,但是如果不使用钩子就无法立即更新它们,而且我不知道如何临时设置钩子并在 vim 退出时删除而不会破坏用户配置。因此标准解决方案是缓存在 N 秒后过期。但是当缓存过期时,我需要进行昂贵的 shell 调用,并且延迟似乎很明显,IO 负载越重越明显。我现在正在实施的是在单独的过程中每 N 秒更新一次查看缓冲区的值,因此延迟会困扰该过程而不是我。由于 GIL 不影响对外部程序的调用,因此线程也可能起作用。

4

2 回答 2

1

我不清楚为什么在任务上无限循环的单个长寿命线程对您不起作用?或者为什么你最终在多进程选项中有许多进程?

我的直接反应将是一个带有队列的单线程来提供它要做的事情。但我可能误解了这个问题。

于 2012-10-30T21:33:56.130 回答
0

我不知道如何在 Python 中简单和/或干净地做到这一点,但我想知道您是否不能利用现有的系统调度程序,例如 *nix 系统的 crontab。

python中有一个API ,它可能会满足您的需求。

于 2012-10-30T20:49:37.030 回答