Django重启时如何终止子线程?
我在使用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
方法)。这样,当主线程结束,比如说要在另一个进程中重启时,整个进程也会结束,这样所有的守护线程也会自动被关闭!