初学 django,django 默认能否并发?

2018-11-21 14:44:24 +08:00
 lanqing

urls.py

    re_path(r'ceshi_uwsgi',view=views.test),
    re_path(r'ceshi_uwsgi2',view=views.test),

views.py

def test(request):
    time.sleep(5)
    return HttpResponse('ok')
def test2(request):
    time.sleep(5)
    return HttpResponse('ok')

启动方式

python manage.py runserver 0:8002

例 1:当我快速在浏览器两个窗口分别输入

http://localhost:8002/publisher/ceshi_uwsgi
http://localhost:8002/publisher/ceshi_uwsgi

给我的反应是一个窗口请求 5 秒执行完后再执行另外一个窗口请求,总共 10 秒

例 2:当我快速在浏览器两个窗口分别输入

http://localhost:8002/publisher/ceshi_uwsgi
http://127.0.0.1:8002/publisher/ceshi_uwsgi

给我的反应是基本上是同时执行 请求总共 5 秒中

我所理解的并发是 django 一个单线程的程序,一个请求没有结束是不能开始第二个请求(换句话就是不能并发),我后来给 django 配置了 uwsgi 服务器,结果还是像上述一样,我不太理解为什么会出现上面这种情况,希望大佬可以指点一二,感谢

11281 次点击
所在节点    Python
26 条回复
lanqing
2018-11-21 14:45:52 +08:00
我希望在两个请求基本上同时发生的情况下,同时结束(能够并发),怎么实现它
Acebiu
2018-11-21 14:54:48 +08:00
请使用专业的工具测试,比如 ab,Chrome 访问两个相同的地址,会在一个加载完毕后再加载另外一个。
scriptB0y
2018-11-21 14:55:20 +08:00
你 uwsgi 配置多个进程多个线程,就支持并发了,默认单进程单线程跑应该还是没并发的。
Neojoke
2018-11-21 15:42:00 +08:00
Python 是有个全局锁,所以 Python 的应用一般是多进程部署,要想彻底搞明白这个问题,先搞定 Python 的全局锁,是什么,然后在研究一下 Django 的 python 启动模式,去官方文档里找 uwsgi 服务器的配置说明,启动完成以后,检查一下进程中是否有多个 uwsgi 进程,如果有,则是多进程启动
SmartKeyerror
2018-11-21 19:25:28 +08:00
首先要分清 Web Server 和 Web Application 之间的区别:Web Server 可以使用多线程多线程或者是 Reactor 模型来支持并发, 前者可以支持并行, 后者因为 GIL 的原因, 只能支持并发。 而 Web Application 仅仅只是一个应用而已, 当你使用 runserver 来启动 Django 时, 其实是启动了 Django 为开发者所提供的测试 Server 而已, 并不支持并发, 请求为串行执行。 至于在配置了 uwsgi Web Server 之后还是不支持并发, 尝试将 process 配置为 CPU 核心数
Nick2VIPUser
2018-11-21 21:19:59 +08:00
生产上可以用 uwsgi+nginx
lfzyx
2018-11-21 21:26:27 +08:00
上面动不动就说 GIL 全局锁的是不是有毛病?你家网站是 CPU 密集型的?
FullBridgeRect
2018-11-21 21:53:45 +08:00
django 自带那个是调试用的,虽然是串行,但正常人是不会将他放到生产环境的。你要并行的 uwsgi 非阻塞模式 /gunicorn 异步引擎了解一下
laike9m
2018-11-21 21:56:57 +08:00
@Neojoke 和 GIL 基本没关系
ltoddy
2018-11-21 21:57:17 +08:00
网络请求本身就是异步的.
111111111111
2018-11-21 22:00:22 +08:00
楼上的不观察细节吗。两次请求的域名不一样就并发…一样就串行

Chrome 有这个毛病,同样的 URL 并发请求,如果第一无响应第二个根本不发出去

另外建议楼主在视图函数的开始和结束时分别打带时间的 Log,这才是 debug 应有的态度
111111111111
2018-11-21 22:01:24 +08:00
@FullBridgeRect django 的 runserver 是多线程的
111111111111
2018-11-21 22:13:14 +08:00
django 文档里明确说明了 runserver 是多线程,如果想要单线程需要加参数--nothreading 为啥各位大佬都说串行……
ericls
2018-11-22 00:10:49 +08:00
wsgi 并发要借助 thread 和 multi-process
FullBridgeRect
2018-11-22 01:24:26 +08:00
@111111111111 是吗😂平时都没留意,很多 wsgi 服务器都说要特定的引擎才能实现非阻塞,就把他套在了 runserver 上面了🙈
Trim21
2018-11-22 01:53:34 +08:00
这个是 chrome 的问题,对同一个 url 只会在第一个请求结束之后才开始第二个请求。
Neojoke
2018-11-22 09:02:35 +08:00
@111111111111 Python 的多线程基本上是伪并行,可以了解一下 GIL 全局锁,就明白了,Python 的应用即便是使用了多线程,但基本上没办法处理高并发,所以一般高并发配合的必须是多进程,或者采用协程,但协程是开弓没有回头箭,一开始是协程,就要任何代码都是协程,否则性能很难保证
petelin
2018-11-22 09:29:53 +08:00
@Neojoke 没法高并发是因为 python 慢,可不是因为什么全局锁。你在学习一下并发和并行的区别就明白了
hljjhb
2018-11-22 09:51:07 +08:00
既视感 两三年前有个如出一辙的帖子
111111111111
2018-11-22 11:00:06 +08:00
@Neojoke

In CPython, due to the Global Interpreter Lock,.....
However, threading is still an appropriate model if you want to run multiple I/O-bound tasks simultaneously.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/510022

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX