этот код работает в режиме 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()
спасибо за любой намек на проблему
Обычно дочерние нити умирают при выходе из основного потока. Код, который вы указали как пример, выйдет сразу после запуска двух дочерних потоков. Чтобы решить эту проблему, вы должны "присоединить" потоки к основному потоку. Это приведет к тому, что основной поток ждет, пока дочерние потоки умрут.
thread1.join()
thread2.join()
в конце файла должен решить эту проблему.
https://docs.python.org/3.5/library/threading.html#threading.Thread.join
Кроме того, почему вы хотите запустить это приложение в качестве демона?