Я не сделал достаточно Python, чтобы дать вам "Pythonic" ответ, но я могу ответить на более общие термины программирования.
Во-первых, я не фанат завершения потоков.В есть случаи, когда это безопасно и нормально, как, например, ваш пример здесь - но завершение в середине print
записи его вывода может показаться немного грязным.
Во-вторых, если выЕсли вы хотите продолжить использовать sleep
(я тоже не фанат), вы можете повторить ваши if stop_event.is_set():
и break
после сна.(Не перемещайте код, скопируйте его.) Основная проблема с sleep
в этом случае состоит в том, что он будет ожидать полного sleep_interval
, даже если событие установлено в течение этого времени.
В-третьих -и мое предпочтение - вместо использования sleep
сделать wait
для события с таймаутом.Если событие не установлено во время ожидания, wait
возвращает false после ожидания периода ожидания.Если событие установлено до или во время ожидания , wait
возвращает true немедленно (то есть, оно прерывает тайм-аут, давая вам быстрое, чистое отключение потока.)
Итак, ваш код будет выглядеть примерно так:
def daemon_loop(sleep_interval, stop_event):
for j in count():
print(j)
if stop_event.wait(sleep_interval):
break
print('Slept %s' % sleep_interval)
print('Prod terminating')