如果python中的线程未循环,它们会自行终止吗?
我的google-foo今天显然是垃圾。但基本上:我有一个在pi上运行的小型热敏打印机,该打印机还托管了alexa服务的网络挂钩。打印机需要在Alexa讲话的同时运行。每次调用启动函数时,它都会启动线程并执行其操作。我不想阻塞主程序,但这会产生一堆永远的线程吗?还是他们只是完成任务然后停下来?这也是超级蛮力。
def printFortune():
fortune = makeFortune()
print("printFortune!",fortune)
printer.println(fortune[0])
printer.println()
printer.println(fortune[1])
printer.println()
printer.println(fortune[2])
printer.println()
printer.feed(3)
printer.setDefault()
### APP THINGS #####################
@app.route('/',methods=['GET','POST'])
def index():
return "hello! This is an alexa test."
### ALEXA THINGS #####################
@ask.on_session_started
def new_session():
log.info('new session started')
log.info(request.locale)
beep = request.locale
print(beep)
@ask.launch
def launch():
t = Thread(target=printFortune)
t.start()
to_say = "This is a very long response that is not the response that's being printed"
return statement(to_say)
@ask.intent('AMAZON.HelpIntent')
def help():
return question("helping").reprompt("helping")
@ask.intent('AMAZON.StopIntent')
def stop():
return statement("stopping")
@ask.intent('AMAZON.CancelIntent')
def cancel():
return statement("canceling")
@ask.session_ended
def session_ended():
log.debug("Session Ended")
print("session ended")
return "{}", 200
if __name__ == '__main__':
app.config['ASK_VERIFY_REQUESTS'] = False
app.run(host='0.0.0.0', port=5000, debug=True, use_reloader=False)
答案 0 :(得分:0)
摘自Threading上的官方文档:
线程开始活动后,该线程将被视为“活动中”。当它的run()方法终止时,它会停止存活–正常情况下或通过引发未处理的异常。 is_alive()方法测试线程是否处于活动状态。
因此,为回答您的问题,您的Thread对象将在其相应的run()
方法终止时终止。您可以使用threading.Thread.is_alive()
来确定线程的run()
方法是否已完成。
该文档继续讨论普通线程和Daemon线程之间的区别(它们在终止策略上确实有所不同),但这似乎不适用于您所发布的示例。
答案 1 :(得分:0)
从文档中:
一旦线程开始活动,就认为该线程 '活'。它的run()方法[或目标方法]停止运行 终止–是正常终止,还是引发未处理的异常终止。
请参阅:https://docs.python.org/3.7/library/threading.html#threading.Thread.run
在您的示例上下文中,您创建的每个线程将在该线程的printFortune()
方法完成(或引发异常)时终止。