当Django重启时杀掉子线程?

时间:2009-09-16 01:51:59

标签: python django multithreading

我正在运行Django,我正在创建在Django运行时并行运行的线程。这些线程有时运行外部进程,在等待外部输入时阻塞。

当我重新启动Django时,那些在等待外部输入时阻塞的线程有时会在重启时继续存在,而且他们还有并保持打开端口8080,因此Django无法重启。

如果我知道Django何时重启,我可以杀死那些线程。如何判断Django何时重启,以便我可以杀死这些线程(以及它们的产生)。

从django.utils.autoreload可以看出,当重启正在发生时,任何挂钩都不明显。

Django启动时是否有其他方法可以杀死这些线程?

感谢阅读。

布赖恩

2 个答案:

答案 0 :(得分:1)

Python进程杀死自己的线程并不容易 - 甚至更难(几乎不可能)杀死另一个进程的线程,我怀疑后者是你的情况...... 。“重启”可能发生在一个不同的进程上,所以这些线程或多或少地超出了你的范围!

我建议改为“时间缝合节省9”:当您创建这些线程时,请确保将其daemon属性设置为True(请参阅the docs - 它是Python中的setDaemon方法< = 2.5)。这样,当主线程结束时,例如,要在另一个进程中重新启动,整个进程也会重启(这也应该自动将所有守护进程线程都关闭!)

答案 1 :(得分:0)

你用什么来重启django?我在该脚本中添加了一些东西来查找套接字文件中的进程ID并在启动django之前终止它们。

或者,您可能会非常沉重,只需在django启动序列之前运行类似'pkill -9 * django *'的内容。