代码之家  ›  专栏  ›  技术社区  ›  mofury

为什么django channels daphne不能使用多线程同时处理请求?

  •  1
  • mofury  · 技术社区  · 6 年前

    我知道python的gil,在python中线程并不像在go中生成go例程那么容易。然而,在我看来,ruby能够通过puma和unicorn实现多线程并发。我的问题其实有两个方面。我的经验仅限于django频道的daphne。

    1. 除了daphne之外,还有哪些web服务器是多线程的,比如rails中的puma和unicorn?

    2. 从daphne的文档中,我了解到并行是通过生成新的进程(workers)来实现的。

      因为运行使用者的工作与与与http、websocket和其他客户机连接的工作是分离的,所以需要运行一个工作服务器集群来完成所有的处理。 每个服务器都是单线程的,因此建议您在每台计算机上每个核心运行一两个;在同一台计算机上运行任意多个并发工作线程是安全的,因为它们不打开任何端口(它们只与通道后端进行对话)。

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Chillar Anand    6 年前

    马上, uvicorn 是达芙妮唯一的替代品,它支持多种加工,可供生产使用。

    $ pip install uvicorn
    
    $ uvicorn avilpage.asgi --workers 4
    

    这将用4个工人启动服务器。

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

        2
  •  0
  •   kagronick    6 年前

    工人不是单线程的。它们中的每一个都会打开一个线程池来运行所有的数据库查询以及运行sync_to_async的任何内容。Daphne的重点是异步,使用Asyncio的主线程越多,它的速度就越快。您希望尽可能消除上下文切换,以便CPU缓存保持新鲜。另外,python的gil一次只让一个线程工作,这就是为什么多个线程的速度没有提高的原因。你可以有25个线程,运行速度可以达到1个线程: https://gist.github.com/agronick/692d9a7bc41b75449f8f5f7cad93a924