此代码可在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()
感谢您对该问题的任何提示
答案 0 :(得分:2)
通常,子线程在主线程退出时死亡。您作为示例给出的代码在启动两个子线程后直接退出。为了解决这个问题,您应该将线程“连接”回主线程。这样一来,主线程便会等待子线程死亡。
thread1.join()
thread2.join()
文件末尾的应该可以解决此问题。
https://docs.python.org/3.5/library/threading.html#threading.Thread.join
此外,为什么要将此程序作为守护程序运行?