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 · 2476 次点击
    这是一个创建于 986 天前的主题,其中的信息可能已经有所发展或是发生改变。

    整个 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   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1264 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 23:13 · PVG 07:13 · LAX 16:13 · JFK 19:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.