python - 时间为零的signal.setitimer,后跟signal.pause不起作用
问题描述
我有以下代码,它按预期工作:
import signal
def printer(signum, frame):
print("hi!")
signal.signal(signal.SIGALRM, printer)
signal.setitimer(signal.ITIMER_REAL, 0.1, 3.0)
while(True):
signal.pause()
我想使用signal.setitimer(signal.ITIMER_REAL, 0.0, 3.0)
,但要正确启动计时器需要稍等:signal.setitimer(signal.ITIMER_REAL, 0.1, 3.0)
. 这里发生了什么事?有没有办法立即启动计时器?
(仅适用于 Linux)
解决方案
的文档signal.setitimer
说,如果seconds
arg 为 0,这将清除计时器:
setitimer(which, seconds, interval=0.0, /) 设置给定的计时器(ITIMER_REAL、ITIMER_VIRTUAL 或 ITIMER_PROF 之一)。 计时器将在 value 秒后触发,之后每隔间隔秒触发一次。 可以通过将秒数设置为零来清除计时器。 将旧值作为元组返回:(延迟,间隔)。
这反映了底层 POSIX setitimer系统调用的行为:
将it_value设置为 0 将禁用计时器,无论it_interval的值如何。
在 POSIX 系统上,it_value 是一个timeval 结构,其精度以微秒为单位。因此,如果您可以在计时器第一次触发之前容忍非常小的延迟,只需使用非常小的参数调用 setitimer,小到 1 微秒:
signal.setitimer(signal.ITIMER_REAL, 0.000001, 3.0)
推荐阅读
- linux - 通过从特定目录递归搜索从所有文本文件中提取最后一行
- python - Kivy:通过间隔逐个字母更新标签文本不起作用
- javascript - 网页打开时Javascript第一次不起作用?
- wordpress - Wordpress 简码输出
- r - Roxygen 警告“无法打开连接”“权限被拒绝”
- reactjs - 测试反应组件状态 onChange
- c# - 编译时与运行时的 .NET 程序集绑定
- python - Pandas - 根据 groupby 中的其他列设置列的最佳方法
- excel - 如何使用数据透视表中的字段填充 Excel 用户表单组合框?
- ios - 如何允许用户通过 Firebase 在存储的配置文件中输入他们的信息,而无需让他们登录/注册?