Я пишу многопоточную программу на python, в которой основной поток и другие потоки, которые он создает, работают как демоны (но не с Thread.daemon = True), которые ищут определенные файлы в определенных каталогах и выполняют с ними действия, когда они существуют.,Возможно, что в одном / любом из потоков возникнет ошибка, которая потребует завершения всей программы.Однако мне нужно, чтобы другие потоки завершили свою текущую работу перед выходом.
Из того, что я понимаю, если я установлю myThread.daemon = True для порожденных мной потоков, они автоматически завершатся сразу после выхода из основного потока.Тем не менее, я хочу, чтобы другие потоки закончили свою текущую работу перед выходом (если ошибка не является своего рода катастрофическим сбоем, в этом случае я, вероятно, просто все равно выйду из системы, безопасно или нет).Поэтому я не устанавливаю для свойства daemon значение True для потоков.
Глядя на документацию модуля потоков и различные доступные мне объекты, такие как события, семафоры, условия и блокировки, я не уверен, что лучше всего справиться со своей ситуацией.Кроме того, я не уверен, как справиться с этим сценарием, когда программа должна завершиться из-за сигналов SIGTERM / SIGINT.
Некоторый код, который иллюстрирует упрощенную версию структуры моей программы:
import threading
import signals
import glob
import time
class MyThread1( threading.thread ):
def __init__( self, name='MyThread1' ):
threading.Thread.__init__( self )
self.name = name
return
def run( self ):
while True:
filePathList = glob.glob( thisThreadDir + '/*.txt' )
for file in filePathList:
try:
doSomeProcessing( file )
# Then move the file to another thread's dir
# or potentially create a new file that will
# be picked up by another thread
except:
# Need to potentially tell all other threads
# to finish task and exit depending on error
# I assume this would be the place to check for some kind of
# flag or other indication to terminate the thread?
time.sleep( 30 )
# Now imagine a few more custom threads with the same basic structure,
# except that what is happening in doSomeProcessing() will obviously vary
# Main Thread/Script
def sigintHandler( SIGINT, frame ):
# How do I handle telling all threads to finish their current loop
# and then exit safely when I encounter this signal?
sys.exit( 1 )
def sigtermHandler( SIGTERM, frame ):
# Same question for this signal handler
sys.exit( 1 )
signal.signal( signal.SIGINT, sigintHandler )
signal.signal( signal.SIGTERM, sigtermHandler )
myOtherThread1 = MyThread1()
myOtherThreadN = MyThreadN()
myOtherThread1.start()
myOtherThreadN.start()
while True:
filePathList = glob.glob( mainDir + '/*.txt' )
for file in filePathList:
try:
doMainProcessing( file )
# Move file or write a new one in another thread's dir
except:
# Again, potentially need to exit the whole program, but want
# the other threads to finish their current loop first
# Check if another thread told us we need to exit?
time.sleep( 30 )