Почему поток демона Python3 мгновенно закрывается в консоли?

1

этот код работает в режиме idle3, но в консоли (MAC, Windows Linux) thread2 мгновенно закрывается, если задан для демона. Есть ли для этого объяснения? Возможно, также обходной путь для правильного создания потока демона с просьбой ввести пользователя?

import queue
import threading
import sys

def worker(q):
    _text = ''
    while _text == '':
        _text = q.get()
        print('[worker]input was ',_text)
    sys.exit()

def dialog(q):
    while True:
        try:
            _select = input('[dialog]enter text:')
            if _select != '':
            q.put(_select)
        except EOFError:
            pass
        except KeyboardInterrupt:
            print("bye")
            sys.exit(0)
        except Exception as e:
            print(e)
            sys.exit(1)
        if 'esc'.lower() in _select.lower():
            sys.exit()

q = queue.Queue()
thread1 = threading.Thread(target=worker,args=(q,))
thread2 = threading.Thread(target=dialog,args=(q,))
thread1.setDaemon(True)
thread2.setDaemon(True)
print('start asking')
thread1.start()
thread2.start()

спасибо за любой намек на проблему

Теги:
python-3.x
multithreading

1 ответ

2
Лучший ответ

Обычно дочерние нити умирают при выходе из основного потока. Код, который вы указали как пример, выйдет сразу после запуска двух дочерних потоков. Чтобы решить эту проблему, вы должны "присоединить" потоки к основному потоку. Это приведет к тому, что основной поток ждет, пока дочерние потоки умрут.

thread1.join()
thread2.join()

в конце файла должен решить эту проблему.

https://docs.python.org/3.5/library/threading.html#threading.Thread.join

Кроме того, почему вы хотите запустить это приложение в качестве демона?

  • 0
    "Почему вы хотите запустить это приложение как демон?" это вопрос, да.
  • 0
    спасибо, что сработало. Я хочу запустить их как демона, чтобы убедиться, что они могут работать независимо, но быть убитым, если основной цикл умрет
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню