Javascript 我不知道';我不理解Node.js体系结构

Javascript 我不知道';我不理解Node.js体系结构,javascript,python,node.js,Javascript,Python,Node.js,我们正在考虑将node.js作为一个web平台。但是我有一个关键的问题,因为我认为我不了解node.js的架构: 看起来默认情况下你不得不使用他们的自定义HTTP服务器,没有WSGI或任何东西 看起来,当在响应中执行一些“实际计算”(不仅仅是一些I/O)时,所有的基础结构都会混乱,并且ab-n-c…与Python——Pyramid/Flask或其他任何东西相比,每个请求返回的次数非常多 所以,node.js的作者假设我们只做了I/O或者我错过了一些非常基本的东西 你自相矛盾:“默认”和“强制”是

我们正在考虑将
node.js
作为一个web平台。但是我有一个关键的问题,因为我认为我不了解
node.js的架构:

  • 看起来默认情况下你不得不使用他们的自定义HTTP服务器,没有WSGI或任何东西

  • 看起来,当在响应中执行一些“实际计算”(不仅仅是一些I/O)时,所有的基础结构都会混乱,并且
    ab-n-c…
    与Python——Pyramid/Flask或其他任何东西相比,每个请求返回的次数非常多

  • 所以,
    node.js
    的作者假设我们只做了I/O或者我错过了一些非常基本的东西

  • 你自相矛盾:“默认”和“强制”是不相容的。您可以使用任何您想要的HTTP库。核心
    http
    模块可能被认为是一个“默认”模块,但没有什么可以阻止您使用另一个模块

  • JavaScript是一种单线程语言,Node.js是一种JavaScript运行时,而不是像许多其他服务器一样,每个响应生成一个线程的web服务器。如果需要,您仍然可以对每个响应执行一个线程,并且在节点上构建的项目也可以执行此操作,但您将失去节点的大部分好处。如果您在响应web请求时执行计算量大的任务(并且您的客户机愿意等待您执行),那么您应该通过许多可用解决方案(web workers、threads-a-go-go、child_process等)中的一个来分离一个线程

  • Node.js的作者假定您正在编写web服务器。在web服务器中执行的大多数操作本质上都是IO,无论该IO是否涉及文件系统、数据库,甚至是用于将计算密集型任务排队到其他workhouse进程的消息总线

  • 回顾您的问题,如果您试图将Node.js与Python和WSGI集成,那么您似乎对Node.js是什么有一个基本的误解。Node.js用于编写web服务器,因此尝试使用它。。。和Python一起?Python内部?(我真的不确定你想要完成什么)没有什么意义

    如果您的任务不仅仅是I/O绑定的,那么您可能不应该将这些任务托管在与web服务器相同的框中。因此,在第3节中简要提到了消息总线方法。但是,如果您决心这样做,并且确信这些任务不会占用所有CPU,那么您应该确定这些任务流行的频率。如果它们出现在每个web请求上,则不应使用Node.js;你正在放弃它最基本的优势,只留下次要的优势(比如围绕它成长起来的生态系统)。如果它们很少见,那么您应该通过2中提供的许多方法在单独的线程中分离它们


    相关:

    如果你是一个基于Python的商店,你可能还想考虑哪种是Python写的事件驱动框架。Twisted还能够将长时间运行的阻塞工作延迟给线程


    最重要的是,你首先要确定你需要什么,你的问题是什么。不要因为每个人都在谈论这个新奇的东西就跳上它。查看您的需求,并使用能够满足这些需求的工具。

    我看到在WSGI之后有一个node.js模块:


    此外,您还可以将密集型计算转移到子进程:

    您应该了解。如果node.js使用它,我会有一点担心。@Kurt:我们对Python和node.js进行了基准测试。将上面的措辞与下面的评论结合起来,你似乎只做了些小动作,用这个“问题”作为表达意见的机会。@Phrogz不,我不是,我只是在寻找如何以最自然的方式使用服务器上的所有16个内核来生成
    node.js
    ,如果我们的任务不仅仅是I/O绑定的话。@James更新了我的答案,专门针对最新的注释。ad3,因此
    node.js
    的概念确实不能很好地处理CPU绑定的子任务。好的。不仅仅是Node.js,还有JavaScript。我没有听你对Python的评论,我只是对Python和Node.js进行了基准测试,Node.js对我们的基准测试来说很糟糕。啊,好吧,听起来你好像在尝试将WSGI与Node一起使用,这(正如@Kurt Spindler所指出的)毫无意义。在2,我说过,节点不是一个web服务器,每个响应都会产生线程。它不是多线程的原因是异步IO的许多优点。每个响应的线程都非常重。群集API用于计算密集型任务,而不是为每个HTTP请求生成一个新线程(这将非常愚蠢)。如果子进程意味着进程,那么分叉是一个糟糕的操作,例如在Linux上。是的,它意味着子进程。密集计算的强度到底有多大,它会影响单线程的性能,但分叉成本仍然相对较大,足以成为您的一个问题?想象一下,每秒有1000个请求,您有两个CPU,每个CPU有6个内核,因此我们自然需要一个使用所有CPU的解决方案。我的意思是,当然——没有代理的代理。你可能想看看这个:你可以在6核机器上运行6个node.js进程,它们将共享HTTP侦听器;虽然这是一个实验性的扩展,但我不知道它究竟如何平衡进程之间的请求。此外,我发现您可以将其作为类似FastCGI的服务器运行:或者您可以将一些定制的解决方案与长寿命的计算孩子和一些协议结合起来,与他们进行对话。您有太多特定的需求,无法期待现成的解决方案。@lanzz我相信负载平衡是由内核随机完成的。