Django重启时如何终止子线程?

0 投票
2 回答
1322 浏览
提问于 2025-04-15 14:21

我在使用Django,并且我创建了一些可以同时运行的线程,这些线程有时候会执行一些外部程序,而这些程序在等待外部输入时会被阻塞。

当我重启Django时,那些在等待外部输入的阻塞线程有时会在重启后继续存在,而且它们还会占用8080端口,这样Django就无法重启了。

如果我知道Django什么时候重启,我就可以结束那些线程。请问有什么方法可以知道Django重启的时机,以便我能结束这些线程(以及它们创建的子线程)呢?

在django.utils.autoreload中,我没有找到明显的地方可以知道重启发生的钩子。

有没有其他方法可以在Django启动时结束这些线程呢?

谢谢阅读。

布莱恩

2 个回答

0

你用什么方法来重启Django呢?我建议在你的脚本里加一些代码,去查找那些在socket文件里的进程ID,然后在启动Django之前把它们杀掉。

另外,你也可以采取比较粗暴的方法,在启动Django之前直接运行类似'pkill -9 *django*'的命令,这样可以强制结束所有与Django相关的进程。

3

在Python中,想要让一个进程杀掉自己创建的线程并不简单;而想要杀掉其他进程的线程几乎是不可能的。我猜你的情况可能就是这样……因为“重启”很可能是在另一个进程中进行的,所以那些线程对你来说基本上是无法控制的!

我建议你采取一个预防措施,俗话说“及时行乐,省得后患”:在你创建线程的时候,确保把它们的daemon属性设置为True(你可以查看官方文档,在Python 2.5及之前版本中是setDaemon方法)。这样,当主线程结束,比如说要在另一个进程中重启时,整个进程也会结束,这样所有的守护线程也会自动被关闭!

撰写回答