求问一个关于 Django 线程的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
NewConn
V2EX    Python

求问一个关于 Django 线程的问题

  •  
  •   NewConn 2019-11-29 17:35:24 +08:00 3426 次点击
    这是一个创建于 2142 天前的主题,其中的信息可能已经有所发展或是发生改变。

    整个 web 服务是用 ssh 连接到另一台机器抓包的。 最近发现 Django 启动后,线程数一直增长,最后服务就崩掉了。 经过排查,原因是服务有一个接口是前端用来周期性查询已抓包数量的,大概 2s 一次;每次查询包数量都是一次请求;当抓包的时候,服务的线程数以肉眼可见速度增长,初步断定就是报文查询接口导致的。 这一块功能没有使用任何多线程,应该就是每次 request 来之后,Django 框架生成的线程。 我的疑惑是当一次请求结束后,Django 不会结束或者复用当前线程吗?有什么办法可以避免这种情况。 先谢过 V 友

    第 1 条附言    2019-11-30 10:12:39 +08:00

    线程问题排查解决了,谢谢各位V友。最后排除发现是查询报文数量后,ssh 连接没有关,导致线程不能正常消亡;在查询完报文数量把 ssh 连接关掉就可以解决问题。

    那么新的问题又来了,我ssh连接用的是python的paramiko,现在是每次查询报文都需要新建一次SSH连接,查询完成后再断开;其实这样子从逻辑上是完全没有必要的,因为对于某一次抓包,每次查询报文都是针对同一个机器,也即可以复用同一个SSH连接,那请问有没有办法在某一次开始抓包后,把这个ssh连接存起来,查询报文数量的时候直接使用这个ssh连接,在结束抓包的时候关闭SSH连接,不用每次查询报文数量都打开一次SSH连接。

    代码如下:

    # 连接SSH cOnn= = paramiko.SSHClient() conn.set_missing_host_key_policy(paramiko.AutoAddPolicy()) conn..connect(host, port, user, password) # 执行命令 stdin, stdout, stderr = conn.exec_command(cmd) # 关闭SSH conn..close() 
    7 条回复    2019-12-10 19:02:46 +08:00
    676529483
        1
    676529483  
       2019-11-29 17:51:23 +08:00
    会结束线程,是不是没有正常退出?如果真的很经常请求,可以用 channels 走 websocket
    Leigg
        2
    Leigg  
       2019-11-29 18:43:31 +08:00 via Android
    请求有及时返回吗?代码有没有问题啊?这种情况百分之九十九是写的代码有问题
    Ehco1996
        3
    Ehco1996  
       2019-11-30 09:44:50 +08:00
    怎么起 django 的?
    前面有一层 webserver 做代理么?
    比如 uwsgi -gunicorn 之类的

    实际上 webserver 之前应该再套一层反代比如 nginx 之类的来做负载均衡
    NewConn
        4
    NewConn  
    OP
       2019-11-30 10:01:07 +08:00
    @Leigg 代码功能是没有问题的,最后排除发现是查询报文数量后,ssh 连接没有关,导致线程不能正常消亡;在查询完报文数量把 ssh 连接关掉就可以解决问题。谢谢解答
    hustlibraco
        5
    hustlibraco  
       2019-11-30 10:16:08 +08:00
    ssh 链接不要复用,经常会莫名其妙 block。还是用到的时候再初始化对象吧,开销也没多大
    Hopetree
        6
    Hopetree  
       2019-11-30 16:50:48 +08:00
    保存状态的话,丢到 redis 里面试试,不知道 ssh 的连接状态 redis 能不能保存,有可能转换一下格式可以存起来后续调用,但是感觉这样反而不如每次单独连接稳妥
    U87
        7
    U87  
       2019-12-10 19:02:46 +08:00
    @Ehco1996 知乎小哥。。哈哈哈
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5487 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 08:31 PVG 16:31 LAX 01:31 JFK 04:31
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86