django Python manage.py runserver 启动测试服务, 每次新的 http 请求 都会新建一个 thread 处理, 之后会自动关闭这个线程 - 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
chaleaoch
V2EX    Python

django Python manage.py runserver 启动测试服务, 每次新的 http 请求 都会新建一个 thread 处理, 之后会自动关闭这个线程

  •  
  •   chaleaoch 2020-11-10 08:44:25 +08:00 2978 次点击
    这是一个创建于 1847 天前的主题,其中的信息可能已经有所发展或是发生改变。
    是这样的吗?
    关闭线程的同时, 资源会自动释放,譬如和数据库的连接, 包括 Django orm 新建的连接和手动 db.connection 创建的连接都会自动释放.

    我是疑问句. 提前感谢大佬解答.
    16 条回复    2020-11-11 00:27:06 +08:00
    ltttx
        1
    ltttx  
       2020-11-10 08:53:20 +08:00
    是的
    nonduality
        2
    nonduality  
       2020-11-10 10:56:29 +08:00
    这个事实对你的开发有什么影响吗?
    SjwNo1
        3
    SjwNo1  
       2020-11-10 11:22:06 +08:00
    测试应该是的
    no1xsyzy
        4
    no1xsyzy  
       2020-11-10 12:29:21 +08:00
    手动连接不一定看具体实现,一般会包含 with 调用方式,请用 with
    chaleaoch
        5
    chaleaoch  
    OP
       2020-11-10 17:20:42 +08:00
    @nonduality 如果我在 view 里面创建一个 connection 或者 什么东西而没有释放,如果线程没有关闭, 那么 这个 connection 会一直存在. 我个人理解是这样的.
    当然后来我才知道 django 有一个信号 专门处理这种情况,但是还是会有其他影响. 譬如 全局变量? 之类.
    chaleaoch
        6
    chaleaoch  
    OP
       2020-11-10 17:21:57 +08:00
    @nonduality 另外本人一直好奇, 一个 HTTP 请求过来 gunicorn 或者 gevent 是如何做命名空间隔离的. 一直没时间精力看代码. 就好奇先问一嘴.
    metamask
        7
    metamask  
       2020-11-10 17:31:34 +08:00
    @chaleaoch #5

    手动创建的连接需要自己管理,


    源码一般是两种写法
    用 with 来控制退出时候 close
    或者结束执行 cursor.close()
    chaleaoch
        8
    chaleaoch  
    OP
       2020-11-10 17:36:13 +08:00
    @freakxx 我的问题就在于此, 我在想如果线程都退出了 那这个连接是不是也就断了?
    metamask
        9
    metamask  
       2020-11-10 17:53:23 +08:00
    @chaleaoch #8


    是的,连接会断,但会有情况就是炸裂的情况下,执行不到


    也就是说,你有一个 http 请求,正常来到结束的时候,它会处理
    但是假设你在 request 过程异常,这个执行应该是执行不到的


    django/http/response.py -L 242

    # The WSGI server must call this method upon completion of the request.
    # See http://blog.dscpl.com.au/2012/10/obligations-for-calling-close-on.html
    def close(self)

    这里会做一些处理
    你要继续了解,可以从这里追代码回去。
    metamask
        10
    metamask  
       2020-11-10 17:58:37 +08:00   1
    你也可以简单看下
    有兴趣也可以简单看下 django/db/__init__.py

    -L 60,
    这里是做了处理
    signals.request_started.connect(close_old_connections)
    signals.request_finished.connect(close_old_connections)
    chaleaoch
        11
    chaleaoch  
    OP
       2020-11-10 18:53:34 +08:00
    @freakxx 谢谢,对的我今天下午看到了.
    chaleaoch
        12
    chaleaoch  
    OP
       2020-11-10 18:55:40 +08:00
    @freakxx #10 你说得对,这块我也看到了.
    #9 看来我还是没说明白. 我的意思是,和 django 没关系
    就起了一个线程 创建了一个 connection, 然后线程退出, connection 自动销毁吗? 应该自动断开吧?
    metamask
        13
    metamask  
       2020-11-10 20:20:35 +08:00   1
    @chaleaoch #12

    会的,
    这跟客户端没关系。

    你连接结束了,服务端能感知到,会关闭的。


    ------------------------------

    我们上面谈的只是说,在某些情况,你不主动关闭,可能会引起 too many connections 这种情况。
    johnsona
        14
    johnsona  
       2020-11-10 20:37:59 +08:00
    @chaleaoch 意思就是比如 wsgi server 创建一个线程去执行引用 django 对象,创建了 connection,但是没执行完,线程结束,这个 connection 还在不在?
    没看过源码,不太清楚,我有几个疑问。
    gunicorn 好像是 prefork 模式,也就是 gunicorn 服务器起来了,django 的 app 对象就在 worker 进程中存在了。假如一个请求来了,一个线程,那会引用当前进程的 django app 对象而不是创建(应该)。django 代码创建了 connection,但是不同线程有不同的 connection,为了不同的 connection 不搞错,会不会有类似 flask 的 threadlocal 这样的东西。
    然后 django 可能会有异常处理,在捕捉到异常后,把对应 connection close 掉
    chaleaoch
        15
    chaleaoch  
    OP
       2020-11-10 21:22:40 +08:00   1
    @freakxx thanks,
    也就是说客户端 线程没了, 并不会自动发送断开连接的 socket 请求.
    而是服务端发现这个 socket 好久都没有接到消息自动断开.

    多谢多谢!无意间一句话又提点我一下.
    phithon
        16
    phithon  
       2020-11-11 00:27:06 +08:00
    web 会自动关闭连接,如果不在 web 里,连接需要手工关
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3890 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 01:00 PVG 09:00 LAX 17:00 JFK 20:00
    Do have faith in what you're doing.
    ubao msn 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