django uwsgi websocket请即时关闭负线程

Posted 茫茫碧落

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django uwsgi websocket请即时关闭负线程相关的知识,希望对你有一定的参考价值。

  当使用django实现一些操作的时候难免会用到线程,但是有点要注意就是在函数中启动线程,setDemond=True,但是这个函数执行完了,副线程并不会关闭,因为主线程还在运行中.

  假定你的副线程中有websocket_send()的操作,如果如果没能够关闭副线程的话,运行到这句话会有一个os错误.但是如果你关掉连接又立即连上,碰巧uwsgi的线程数也是相同的话,那么这句话就能正常运行这个uwsgi还会存活着,并且新的副线程也会起来,相当于有两个副线程在给你发消息,可能会有很多很多的消息.

  关闭副线程的方法,可以用队列Queue.queue(),这个是Python自带的一个线程安全的队列库.

  或者可以在redis中存一个变量,主函数退出的时候把这个变量删掉或者赋上一个代表断线的值,副线程捕获到这个消息kill掉自己即可(raise Exception("I kill my self because connection disconnected"))

以上是关于django uwsgi websocket请即时关闭负线程的主要内容,如果未能解决你的问题,请参考以下文章

django + nginx + uwsgi + websocket

Ubuntu + Django(DRF) + channels(websocket)+NGINX + uwsgi 环境部署

django 多线程 + uWSGI 多线程 遇到的坑

解决websocket使用uWSGI+nginx路由丢失

使用 nginx 和 daphne 部署 django、channels 和 websockets

Django 频道和 uWSGI