Как изящно выйти из потока python deamon - PullRequest
0 голосов
/ 10 июля 2020

У меня есть код, как показано ниже

def run():
  While True:
    doSomething()
def main():
  thread = threading.thread(target = run)
  thread.setDaemon(True)
  thread.start() 
  doSomethingElse()

, если я напишу код, как указано выше, когда основной поток завершится, поток Deamon выйдет, но, возможно, все еще находится в процессе doSomething.

Основная функция будет вызываться извне, мне не разрешено использовать join в основном потоке, могу ли я как-то сделать, чтобы поток Демона корректно завершился после завершения основного потока.

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Вы можете использовать поток threading.Event, чтобы сигнализировать дочернему потоку, когда следует выйти из основного потока.

Пример:

class DemonThead(threading.Thread):

    def __init__(self):
        self.shutdown_flag = threading.Event()

    def run(self):
        while not self.shutdown_flag:
            # Run your code here
            pass

def main_thread():
    demon_thread = DemonThead()
    demon_thread.setDaemon(True) 
    demon_thread.start()
    
    # Stop your thread
    demon_thread.shutdown_flag.set()
    demon_thread.join()
0 голосов
/ 10 июля 2020

Вам не разрешено использовать join, но вы можете установить Event и не использовать флаг daemonic. Официальный do c ниже:

Примечание : потоки демона внезапно останавливаются при завершении работы. Их ресурсы (такие как открытые файлы, транзакции базы данных и т. Д. c.) Могут быть освобождены неправильно. Если вы хотите, чтобы ваши потоки корректно останавливались, сделайте их недемоническими c и используйте подходящий механизм сигнализации, такой как Event.

...