我在 Python Flask 中有一些代码,它执行以下操作:
目前用户必须等待 3.3 秒才能将视图返回给他们,因此我想在写入数据库时将视图返回给用户。我的计划是为此使用线程,但我永远无法运行 x.join()。这是我的代码:
import threading
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')
据我在 internet 上所知,当我从线程内部调用
return
时,线程将关闭。是不是只要我在线程内部调用return
,就不需要运行x.join()
来关闭?
就你而言,不。线程只会因
return
或导致线程函数终止的异常而退出。此退出会在内存中留下一些线程信息以供 .join
清理。 .join
不会终止线程 - 但它与删除您创建的 Thread
对象一起会清理该内存。
Python 保留已创建线程的列表,并在程序退出时对每个线程执行
.join
。如果您使用 daemon=True
创建线程,它不会添加到列表中,并且没有最终连接。当进程退出时,任何仍在运行的守护线程都会被终止。
但一般来说,想法是您可以创建一个线程,而不用担心加入,甚至不用担心当
__main__
退出时线程是否已完成。如果线程的工作没有完成,Python 会等你完成。这就是你的情况所发生的情况。除非你真的想要在线程完成时进行打印,否则请跳过连接和打印并让 python 进行等待。
如果您的代码确实需要知道线程何时完成,那么您可以自己进行连接。如果它是一个长时间运行的程序,创建了一堆线程,那么您可能需要执行自己的连接以确保释放死线程资源。