Python 线程 Flask - 我需要使用 x.join() 关闭线程吗?

问题描述 投票:0回答:1

我在 Python Flask 中有一些代码,它执行以下操作:

  1. 获取用户输入
  2. 计算(0.3秒)
  3. 写入数据库(3秒)
  4. 将视图返回给用户

目前用户必须等待 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()
来关闭?

python flask python-multithreading
1个回答
0
投票

就你而言,不。线程只会因

return
或导致线程函数终止的异常而退出。此退出会在内存中留下一些线程信息以供
.join
清理。
.join
不会终止线程 - 但它与删除您创建的
Thread
对象一起会清理该内存。

Python 保留已创建线程的列表,并在程序退出时对每个线程执行

.join
。如果您使用
daemon=True
创建线程,它不会添加到列表中,并且没有最终连接。当进程退出时,任何仍在运行的守护线程都会被终止。

但一般来说,想法是您可以创建一个线程,而不用担心加入,甚至不用担心当

__main__
退出时线程是否已完成。如果线程的工作没有完成,Python 会等你完成。这就是你的情况所发生的情况。除非你真的想要在线程完成时进行打印,否则请跳过连接和打印并让 python 进行等待。

如果您的代码确实需要知道线程何时完成,那么您可以自己进行连接。如果它是一个长时间运行的程序,创建了一堆线程,那么您可能需要执行自己的连接以确保释放死线程资源。

© www.soinside.com 2019 - 2024. All rights reserved.