我想设置一个警报(类似于 signal.alarm),其粒度比整数秒更细。例如,我想设置0.4秒或3.2秒的闹钟。我对持续时间不到一秒的警报特别感兴趣。
在Python 3中,我只尝试过“导入信号”并调用“signal.alarm(time)”,其中“时间”是一个整数。如果“time”是浮点数,则调用失败。这并不奇怪,因为文档说“时间”必须是整数。
在 Python 2 中的某个时刻,我发现了一些实现从 Python 访问“ualarm()”的代码,但所有这些在这一点上都已经过时了。
在Python 3中,
signal.alarm()
函数只接受整数秒,所以你不能直接设置小数秒的闹钟。但是,您可以通过使用其他机制来实现更细的粒度,例如 threading.Timer
、asyncio
或 signal.setitimer()
。这些替代方案允许您设置亚秒级精度的计时器。
signal.setitimer()
功能支持设置更细粒度的定时器。您可以使用它创建在指定秒数(包括小数秒)后触发的警报。
以下是如何使用
signal.setitimer()
设置小数秒闹钟的示例:
import signal
import time
# Handler for the alarm
def alarm_handler(signum, frame):
print("Alarm triggered!")
# Register the alarm signal handler
signal.signal(signal.SIGALRM, alarm_handler)
# Set an interval timer with fractional seconds
# ITIMER_REAL counts real time and delivers SIGALRM when it expires
seconds = 0.4
signal.setitimer(signal.ITIMER_REAL, seconds)
# Sleep or do something while waiting for the alarm
print(f"Alarm set for {seconds} seconds...")
time.sleep(1) # Sleep to allow the alarm to trigger
signal.setitimer
来实现:
signal.setitimer(signal.ITIMER_REAL, 0.5)
当然,还有各种更高级别的方法可以安排从现在起 0.5 秒后执行某些操作,因此通过低级别信号 API 可能不是您正在做的事情的最佳方法。
此外,请记住,C
sleep
和 usleep
函数可以使用 SIGALRM
实现,因此将对 signal.setitimer
或 signal.alarm
的调用与任何可能调用 C sleep
或usleep
。 (Python 的 time.sleep
不使用这些函数,所以可能没问题。)