为什么Python3守护程序线程立即在控制台中关闭?

时间:2018-09-21 07:49:17

标签: python python-3.x multithreading

此代码可在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()

感谢您对该问题的任何提示

1 个答案:

答案 0 :(得分:2)

通常,子线程在主线程退出时死亡。您作为示例给出的代码在启动两个子线程后直接退出。为了解决这个问题,您应该将线程“连接”回主线程。这样一来,主线程便会等待子线程死亡。

thread1.join()
thread2.join()
文件末尾的

应该可以解决此问题。

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

此外,为什么要将此程序作为守护程序运行?