Правильный ответ *1001* заключается в использовании Python stdlib threading.Event
Конечно, вы можете настроить интервал сна, чтобы вы спали в течение очень коротких периодов, но чтоесли вы на самом деле хотите запускать цикл один раз каждые 60 с?Затем вам нужно сделать больше работы, чтобы определить, пора ли бежать или просто спать.Кроме того, вы все еще технически блокируете, но только на короткий период времени.В отличие от threading.Event
:
#!/usr/bin/env python2.7
from threading import Event
exit = Event()
def main():
while not exit.is_set():
do_my_thing()
exit.wait(60)
print("All done!")
# perform any cleanup here
def quit(signo, _frame):
print("Interrupted by %d, shutting down" % signo)
exit.set()
if __name__ == '__main__':
import signal
for sig in ('TERM', 'HUP', 'INT'):
signal.signal(getattr(signal, 'SIG'+sig), quit);
main()
Когда обработчик сигнала вызывает exit.set()
, вызов wait()
основного потока будет немедленно прерван.
Теперь вы можете использовать Event
, чтобы сигнализировать о том, что есть еще работа, и т. Д. Но в этом случае он выполняет двойную функцию в качестве удобного индикатора, который мы хотим выйти (например, часть while not exit.is_set()
).)
У вас также есть возможность поместить любой код очистки после цикла while
.