Python Flask中使用threading:是否需调用x.join()关闭线程?
问题
我在Python Flask中有如下代码流程:
- 获取用户输入;
- 计算(耗时0.3秒);
- 写入数据库(耗时3秒);
- 返回视图给用户。
目前用户需等待3.3秒才能收到视图,因此我希望在返回视图的同时执行数据库写入,计划用threading实现,但没办法执行x.join()。我的代码如下:
import threading import time # 原代码遗漏了time模块导入 def something_slow(my_variable): print(f"Thread is starting and will execute on {my_variable}") time.sleep(3) return if __name__ == "__main__": print("Starting") x = threading.Thread(target=something_slow, args=('my variable, probably a SQL query',)) x.start() print("this code will execute while the slow thing is happening") # code that will execute while something slow is happening: return render_template('results.html') x.join() # this wil NEVER execute!!! print('something slow is done')
我从网上了解到,在线程内调用return会关闭线程,想问下是不是只要在线程内调用return,就不用运行x.join()来关闭线程?
回答
先明确核心:线程函数里调用
return确实会让线程结束——当线程的目标函数执行完毕(不管是正常return还是抛出异常),这个线程就会进入终止状态,不需要额外调用join()来"关闭"它。join()的作用只是让主线程等待子线程完成后再执行后续代码,不是用来关闭线程的。回到你的Flask场景:你要的是返回视图后再执行数据库写入,这种情况下完全不需要调用
x.join()——因为一旦你执行return render_template(...),Flask的请求处理线程就会结束,后续的x.join()根本没机会执行(正如你注释里写的那样)。你启动的子线程会在后台继续运行,直到something_slow函数做完所有操作(包括数据库写入),然后自动终止。但要注意两个细节:
- Flask默认的开发服务器在线程管理上可能有问题,生产环境建议用Gunicorn、uWSGI这类专业服务器,避免子线程被意外中断。
- 如果数据库写入可能抛出异常,最好在子线程里加异常捕获,不然异常导致线程意外终止时,你连日志都看不到。
内容的提问来源于stack exchange,提问作者Muriel
相关产品推荐
相关产品推荐

