Python Flask Web 教程中启动线程任务后为什么还要返回线程对象?
这个是教程里的示范代码,最后一行有一个 return thr
按理,这个 thread 任务完成了,应该自动回收吧? return thr 返回的作用是什么呢?我实际测试,注释掉 return thr 或者 return None 都没有问题的。
def send_async_email(app, msg):
with app.app_context():
mail.send(msg)
def send_email(to, subject, template, **kwargs):
app = current_app._get_current_object()
msg = Message(app.config[‘FLASKY_MAIL_SUBJECT_PREFIX’] + ’ ’ + subject,
sender=app.config[‘FLASKY_MAIL_SENDER’], recipients=[to])
msg.body = render_template(template + ‘.txt’, **kwargs)
msg.html = render_template(template + ‘.html’, **kwargs)
thr = Thread(target=send_async_email, args=[app, msg])
thr.start()
return thr
Python Flask Web 教程中启动线程任务后为什么还要返回线程对象?
在Flask中启动后台线程后返回线程对象,主要是为了后续能够对这个线程进行管理和控制。
比如你启动了一个处理数据的后台任务:
import threading
import time
from flask import Flask
app = Flask(__name__)
def background_task():
time.sleep(5)
print("后台任务完成")
@app.route('/start')
def start_task():
thread = threading.Thread(target=background_task)
thread.start()
# 返回thread对象,可以存到全局变量或队列里,方便后续join或检查状态
return "任务已启动"
如果不返回或保存这个thread对象,你就没法知道它是否还在运行、是否出错、或者等它结束。
虽然Flask请求结束后线程仍会在后台运行,但保留线程对象的引用可以让你:
- 在需要时等待线程结束(比如优雅关闭服务时
thread.join()) - 检查
thread.is_alive()来判断任务状态 - 传递线程对象给其他模块做统一管理(例如任务队列)
所以返回线程对象是为了程序的可控性,而不是为了让它继续运行。
总结:返回线程对象是为了后续管理,不是必须但通常是好习惯。
把创建的新对象丢到上层管理是好习惯。。
人家写的意思,可能是如果我上层逻辑想要管理线程可以监控线程的 status
当然你不返回也没啥问题,只要保证线程能结束,但是就无法保证是否成功结束。。除非有状态记录( DB or 缓存)
不管有没有 return, thr.start() 执行后这个线程就开始跑了,函数调用完毕后就停了。return 出去应该是保证如果想获取或控制这个线程状态时能拿到线程对象。

