我知道Python的GIL和Python中的线程并不像在Go中生成一个go例程那么容易。然而,在我看来,Ruby能够与Puma和Unicorn一起实现多线程并发。我的问题其实是双重的。我的经验仅限于Django频道的Daphne。
如前所述,每个工作人员都是单线程的。当涉及到I/O函数调用时,工作人员会被完全阻塞。我的问题是,为什么Daphne不能为每个请求生成多个线程。当一个线程被I/O阻塞(例如数据库访问)时,CPU切换到执行另一个线程,直到前一个线程被解除阻塞为止。类似地,Node.js是单线程的,但是它通过非阻塞I/O实现并发性非常好。为什么很难实现同样的壮举。用Python?(此外,它缺乏一个好的事件循环。)
发布于 2018-06-08 05:49:56
现在,乌维霍恩是daphne的唯一选择,它支持多个处理,并已准备好用于生产。
$ pip install uvicorn
$ uvicorn avilpage.asgi --workers 4
这将用4名工作人员启动服务器。
由于daphne/uvicorn使用异步处理多任务,我想多线程是没有意义的。
发布于 2018-07-06 20:59:17
工人不是单螺纹的。每个线程池都打开一个线程池来运行所有数据库查询和运行sync_to_async的任何内容。Daphne的重点是异步,在主线程中保持异步的速度越快。您希望尽可能地消除上下文切换,这样CPU缓存就会保持新鲜。而且,Python的GIL一次只运行一个线程,这就是为什么多线程不会增加速度的原因。您可以有25个线程,它的运行速度可以达到1个线程:https://gist.github.com/agronick/692d9a7bc41b75449f8f5f7cad93a924
https://stackoverflow.com/questions/50734957
复制相似问题