Если вы знаете, когда будет следующий запуск, вы можете просто использовать time.sleep
:
import time
interval = 5
next_run = 0
while True:
time.sleep(max(0, next_run - time.time()))
next_run = time.time() + interval
action_print()
Если вы хотите, чтобы другие потоки могли прерывать вас, используйте событие вот так:
import time,threading
interval = 5
next_run = 0
interruptEvent = threading.Event()
while True:
interruptEvent.wait(max(0, next_run - time.time()))
interruptEvent.clear()
next_run = time.time() + interval
action_print()
Теперь другой поток может вызвать interruptEvent.set()
, чтобы разбудить вас.
Во многих случаях вам также понадобится использовать1015 * Блокировка , чтобы избежать условий гонки на общих данных.Обязательно очистите событие, пока удерживаете блокировку.
Вы также должны знать, что в cpython только один поток может выполнять код Python.Поэтому, если ваша программа привязана к нескольким потокам и вы используете cpython или pypy, вы должны заменить threading
на multiprocessing
.