TL; DR threading.Timerはシステム時間を使用しますが、使用中に時間が変化します。システムの稼働時間を使用するにはどうすればよいですか?
私はPythonスクリプトを持っており、その1つがシステム時刻に設定されています。このスクリプトが起動すると、時間が間違っています。このスクリプトには、30秒のグローバルタイムアウトも必要です。
私は次のタイムアウトクラスを使用しています:
class Timeout(object):
def __init__(self, seconds=1, signum=signal.SIGUSR1, exception=TimeoutException):
self.exception = exception
self.pid = os.getpid()
self.signum = signum
self.timer = threading.Timer(seconds, self.exit_function)
def exit_function(self):
os.kill(self.pid, self.signum)
def handle_timeout(self, signum, frame):
raise self.exception()
def __enter__(self):
signal.signal(self.signum, self.handle_timeout)
self.timer.start()
def __exit__(self, type, value, traceback):
self.timer.cancel()
これでスクリプト全体がラップされます。
with Timeout(seconds=30):
main()
スクリプトがすぐに失敗したり、30秒後に強制終了されたりしないことがあります。これはthreading.Timer
、スクリプトの実行中に変更されるシステム時刻を使用しているためだと思います。とにかく、システムの稼働時間を使用するためにそれを取得することはできますか?
更新
私が今していることは、PyPIthreading._time
のmonotonic
パッケージから単調関数でモンキーパッチを適用することです。
import threading
import monotonic
threading._time = monotonic.monotonic
元の答え
threading.Timer
システムの稼働時間を使用するように拡張することになりました。
class Timer(threading._Timer):
def __init__(self, *args, **kwargs):
super(Timer, self).__init__(*args, **kwargs)
# only works on Linux
self._libc = ctypes.CDLL('libc.so.6')
self._buf = ctypes.create_string_buffer(128)
def uptime(self):
self._libc.sysinfo(self._buf)
return struct.unpack_from('@l', self._buf.raw)[0]
def run(self):
start_time = self.uptime()
while not self.finished.is_set():
time.sleep(0.1)
if self.uptime() - start_time > self.interval:
self.function(*self.args, **self.kwargs)
break
self.finished.set()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加