gpt4 book ai didi

perl - 非事件驱动的 HTTP 服务器环境中的服务器端 Websocket 实现

转载 作者:行者123 更新时间:2023-12-04 21:44:27 25 4
gpt4 key购买 nike

我试图了解服务器端 Websocket 端点的实现/选项 - 特别是在使用 PSGI/Plack 的 Perl 中,我有一个问题:为什么所有服务器端 websocket 实现都基于事件驱动的 PSGI 服务器(Twiggy、Tatsumaki 等)? )?

我知道 websocket 通信是异步的,但是非事件驱动的 PSGI 服务器(比如 Starman)可以产生一个异步监听器来处理 websocket 方面的事情。我已经看到(但没有理解)Websocket 服务器的 PHP 实现,那么为什么不能在不将服务器更改为事件驱动服务器的情况下使用 PSGI 完成相同的操作呢?

最佳答案

处理套接字的底层网络逻辑取决于平台、操作系统和特定的软件实现。
最常见的三种方法是:

  • - 有阻塞常量“询问”套接字是否有一些数据。这种方法很糟糕,因为只要它等待一些数据,它就会阻塞主线程的执行。
  • 每个 socket 的线程 - 每个新连接都涉及创建新线程并在该线程内以阻塞方式询问每个套接字。所以它不会用逻辑阻塞主线程。这种方法很糟糕,因为为每个连接创建线程对于内存来说太昂贵了,并且可能是基于操作系统和其他标准的大约 1Mb 或 RAM。
  • 异步 - 使用系统功能在有事情时“通知”您的进程。因此,一旦您的应用程序准备就绪(在单线程应用程序的情况下),您就可以使用react,甚至可以立即在单独的线程中使用react。这种方法非常有效,因为它节省了 RAM,并且允许您的应用程序运行而无需等待或请求数据。它利用了大多数操作系统和平台提供的现有功能。

  • 考虑到这一点,您确实可以创建单进程功能方式来处理套接字流量。但正如之前所证明的那样,这根本没有效率。这就是为什么今天完全异步模型是主要的,因为大多数语言和平台都支持这种范式。

    关于perl - 非事件驱动的 HTTP 服务器环境中的服务器端 Websocket 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16979249/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com