首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么Django通道Daphne不能使用多线程并发处理请求?

为什么Django通道Daphne不能使用多线程并发处理请求?
EN

Stack Overflow用户
提问于 2018-06-07 07:09:50
回答 2查看 6.6K关注 0票数 1

我知道Python的GIL和Python中的线程并不像在Go中生成一个go例程那么容易。然而,在我看来,Ruby能够与Puma和Unicorn一起实现多线程并发。我的问题其实是双重的。我的经验仅限于Django频道的Daphne。

  1. 除了Daphne之外,web服务器还有哪些其他选择,比如Rails中的美洲狮和独角兽?
  2. 从Daphne的文档中,我了解到并行性是通过生成新的流程(工作人员)来实现的。 因为运行使用者的工作与与HTTP、WebSocket和其他客户端连接对话的工作是分离的,所以您需要运行一个由“辅助服务器”组成的集群来完成所有处理。每个服务器都是单线程的,因此建议您在每台机器上运行一到两个内核;在同一台机器上运行尽可能多的并发工作人员是安全的,因为他们不打开任何端口(他们所做的只是与通道后端对话)。

如前所述,每个工作人员都是单线程的。当涉及到I/O函数调用时,工作人员会被完全阻塞。我的问题是,为什么Daphne不能为每个请求生成多个线程。当一个线程被I/O阻塞(例如数据库访问)时,CPU切换到执行另一个线程,直到前一个线程被解除阻塞为止。类似地,Node.js是单线程的,但是它通过非阻塞I/O实现并发性非常好。为什么很难实现同样的壮举。用Python?(此外,它缺乏一个好的事件循环。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-08 05:49:56

现在,乌维霍恩是daphne的唯一选择,它支持多个处理,并已准备好用于生产。

代码语言:javascript
复制
$ pip install uvicorn

$ uvicorn avilpage.asgi --workers 4

这将用4名工作人员启动服务器。

由于daphne/uvicorn使用异步处理多任务,我想多线程是没有意义的。

票数 2
EN

Stack Overflow用户

发布于 2018-07-06 20:59:17

工人不是单螺纹的。每个线程池都打开一个线程池来运行所有数据库查询和运行sync_to_async的任何内容。Daphne的重点是异步,在主线程中保持异步的速度越快。您希望尽可能地消除上下文切换,这样CPU缓存就会保持新鲜。而且,Python的GIL一次只运行一个线程,这就是为什么多线程不会增加速度的原因。您可以有25个线程,它的运行速度可以达到1个线程:https://gist.github.com/agronick/692d9a7bc41b75449f8f5f7cad93a924

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50734957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档