node.js
作为Web平台。但我有一个至关重要的问题,因为我认为我没有理解node.js
的架构:
看起来默认情况下是被迫使用它们的自定义HTTP服务器,没有WSGI或其他?!
当在响应中进行一些“真正的计算”(不仅仅是一些I / O)时,似乎所有基础设施都会混乱,与例如Python - Pyramid / Flask等相比,每个请求的时间都会返回巨大的ab -n ... -c ... ?!
所以,
node.js
的作者认为我们只做I / O或我错过了一些非常基本的东西吗?
node.js
作为Web平台。但我有一个至关重要的问题,因为我认为我没有理解node.js
的架构:
看起来默认情况下是被迫使用它们的自定义HTTP服务器,没有WSGI或其他?!
当在响应中进行一些“真正的计算”(不仅仅是一些I / O)时,似乎所有基础设施都会混乱,与例如Python - Pyramid / Flask等相比,每个请求的时间都会返回巨大的ab -n ... -c ... ?!
所以,node.js
的作者认为我们只做I / O或我错过了一些非常基本的东西吗?
您自相矛盾:“默认情况下”和“强制执行”是不兼容的。您可以使用任何HTTP库。核心http
模块可以被视为“默认”,但没有什么可以阻止您使用另一个。
JavaScript是单线程语言,Node.js是JavaScript运行时,而不是像许多其他Web服务器一样为每个响应生成一个线程的Web服务器。如果您想要为每个响应启动一个线程,您仍然可以这样做,并且有一些在Node之上构建的项目可以实现此功能,但是您会失去大部分Node的优势。如果您正在响应Web请求时进行计算密集型工作(并且您有愿意等待您完成它的客户端),则应通过许多可用解决方案之一(Web Workers、Threads-a-go-go、Child_process等)启动单独的线程。
Node.js的作者认为您正在编写Web服务器。您在Web服务器中执行的大多数操作本质上都是IO,无论该IO涉及文件系统、数据库还是甚至用于将计算密集型任务排队到其他工作进程的消息总线。
从您的问题来看,如果您试图将Node.js与Python和WSGI集成,则似乎存在基本误解。Node.js用于编写Web服务器,因此尝试将其与Python一起使用...在Python中?(我真的不确定您要实现什么)没有多大意义。
如果您的任务不仅受I/O限制,那么您可能不应该在同一台机器上托管这些任务。因此,在3中简要提到的消息总线方法非常相关。但是,如果您决定这样做,并且确信这些任务不会占用所有CPU,则应确定此类任务出现的频率。如果它们在每个Web请求上都存在,则不应使用Node.js;您正在放弃其最基本的优势,仅剩下次要优势(如围绕它发展的生态系统)。如果它们很少见,则应通过2中的许多方法将它们分开成单独的线程。
node.js
的概念确实无法很好地处理CPU密集型子任务。好的。 - Cartesius00我看到有一个基于WSGI的node.js模块:Strata
此外,您可以将密集计算卸载到子进程中:Child Process
node.js
以最自然的方式使用我们服务器上的所有16个核心,如果我们的任务不仅是I/O绑定的话。 - Cartesius00