如果不循环,python线程会自行终止吗?

时间:2018-08-15 23:48:42

标签: python multithreading

如果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)

2 个答案:

答案 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()方法完成(或引发异常)时终止。