有没有办法设置几分之一秒的警报信号?

问题描述 投票:0回答:2

我想设置一个警报(类似于 signal.alarm),其粒度比整数秒更细。例如,我想设置0.4秒或3.2秒的闹钟。我对持续时间不到一秒的警报特别感兴趣。

在Python 3中,我只尝试过“导入信号”并调用“signal.alarm(time)”,其中“时间”是一个整数。如果“time”是浮点数,则调用失败。这并不奇怪,因为文档说“时间”必须是整数。

在 Python 2 中的某个时刻,我发现了一些实现从 Python 访问“ualarm()”的代码,但所有这些在这一点上都已经过时了。

python python-3.x alarm
2个回答
0
投票

在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



0
投票

您可以使用

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
不使用这些函数,所以可能没问题。)

© www.soinside.com 2019 - 2024. All rights reserved.