Я пишу программу на Python. Эта программа прерывается очень часто, взаимодействием пользователя (CRTL + C), а также другими программами, отправляющими различные сигналы, все из которых должны останавливать работу потока различными способами. Нить выполняет кучу единиц работы (я называю их "атомами" ) в последовательности.
Каждый атом может быть остановлен быстро и безопасно, поэтому сделать сам поток остановки довольно тривиальным, но мой вопрос: что такое "правильный", или канонический способ реализации потока с остановкой, заданный stoppable, pseudo -атомные работы должны быть выполнены?
Должен ли я опросить флаг stop_at_next_check
перед каждым атомом (пример ниже)? Должен ли я украсить каждый атом чем-то, что делает проверку флага (в основном то же, что и в примере, но скрыто в декораторе)? Или я должен использовать другую технику, о которой я не думал?
Пример (простая проверка остановленного флага):
class stoppable(Thread):
stop_at_next_check = False
current_atom = None
def __init__(self):
Thread.__init__(self)
def do_atom(self, atom):
if self.stop_at_next_check:
return False
self.current_atom = atom
self.current_atom.do_work()
return True
def run(self):
#get "work to be done" objects atom1, atom2, etc. from somewhere
if not do_atom(atom1):
return
if not do_atom(atom2):
return
#...etc
def die(self):
self.stop_at_next_check = True
self.current_atom.stop()