Все вместе, с фиктивными исключениями и отладочными отпечатками:

у многопоточную программу на 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 )

Ответы на вопрос(1)

Ваш ответ на вопрос