在能够立即终止执行程序(线程或进程)的同时,以固定间隔连续重复执行给定函数的最佳方法是什么?
基本上我知道两种方法:
time.sleep
。处理在任何州都以process.terminate()
终止。timer.cancel()
处理终止处理。(“任何状态”和“睡觉时”都很好,即使后者可能不是立竿见影的)。问题是我必须使用多处理和线程,因为后者似乎不适用于ARM(python解释器和vim的一些模糊交互,在vim之外一切都很好)(我在那里使用第二种方法,没试过线程+循环;当前没有代码留下),前者产生了太多的进程,除非确实需要,否则我不希望看到这些进程。这会导致必须编写两种不同方法的问题,而threading
周期只需要几个导入就可以替换包含在multiprocessing
/ {{1}中的所有if
内容(除了没有else
)。有没有更好的方法来完成这项工作?
目前使用的代码是here(目前这两个职位都有周期),但我不认为回答这个问题会有用。
更新:我使用此解决方案的原因是在vim statusline中的版本控制系统中显示文件状态(以及其他一些内容,如分支)的功能。必须更新这些状态,但是如果不使用挂钩就不能立即更新它们,我不知道如何设置临时挂钩并在vim退出时删除而不会破坏用户配置。因此标准解决方案是在N秒后缓存到期。但是当缓存过期时,我需要进行昂贵的shell调用,延迟似乎很明显,IO负载越重就越明显。我现在正在实现的是在一个单独的进程中每N秒更新已查看缓冲区的值,因此延迟会困扰该进程而不是我。线程可能也有效,因为GIL不会影响对外部程序的调用。
答案 0 :(得分:1)
我不清楚为什么在任务上无限循环的单个长期线程对你不起作用?或者为什么在多进程选项中最终得到许多进程?
我的直接反应是一个带有队列的单个线程来为它提供帮助。但我可能误解了这个问题。
答案 1 :(得分:0)
我不知道在Python中它是如何简单和/或干净的,但我想知道你是否可能无法利用现有的系统调度程序,例如:用于* nix系统的crontab。
有一个API in python ,它可能满足您的需求。