我在网络编程方面不是很有经验,
而且我实际上还没有在 Node.js 中编写任何代码,只是对 event-driven approach 感到好奇.它看起来不错。
这篇文章解释了当我们使用基于线程的方法来处理请求时可能发生的一些不好的事情,而应该选择事件驱动的方法。
在基于线程的情况下,收银员/线程会一直跟着我们,直到我们的食物/资源准备好。在事件驱动中,收银员将我们发送到请求队列之外的某个位置,因此我们在等待食物时不会阻止其他请求。
要扩展基于阻塞的线程,您需要增加线程数。
对我来说,这似乎是不正确使用线程/线程池的一个不好的借口。
使用 IHttpAsyncHandler 不能正确处理吗?
ASP.Net 接收请求,使用 ThreadPool 并运行处理程序 (BeginProcessRequest),然后我们在其中使用回调加载文件/数据库。然后该线程应该可以自由处理其他请求。一旦文件读取完成,线程池将再次被调用并执行剩余的响应。
对我来说没什么不同,那为什么不那么可扩展呢?
我所知道的基于线程的缺点之一是,使用线程需要更多内存。但只有有了这些,您才能享受多核的好处。我怀疑 Node.js 根本没有使用任何线程/核心。
因此,仅基于事件驱动与基于线程(不要带来“因为它是 Javascript 和每个浏览器...”的论点),有人可以指出我使用 Node.js 而不是使用 Node.js 的实际好处是什么现有技术?
这是一个很长的问题。谢谢:)
最佳答案
首先,Node.js 不是多线程的。这很重要。您必须是一个非常有才华的程序员才能设计在线程环境中完美运行的程序。线程只是很难。
你必须成为一个上帝来维护一个设计不正确的线程项目。在非常大的项目中,有很多问题是难以避免的。
其次,整个平台被设计为异步运行。你有没有看到任何一个 IO 交互都是异步的 ASP.NET 项目?简而言之,ASP.NET 并不是为事件驱动而设计的。
然后,由于每个开放连接有一个线程以及整个扩展问题,因此存在内存占用量。如果我错了,请纠正我,但我不知道您将如何避免为 ASP.NET 中的每个连接创建一个新线程。
另一个问题是 Node.js 请求在未被使用或等待 IO 时处于空闲状态。另一方面,C# 线程休眠。现在,可以休眠的这些线程的数量是有限制的。在 Node.js 中,您可以轻松地在一台开发机器上同时并行处理 10k 个客户端。您尝试在一台开发机器上并行处理 10k 个线程。
JavaScript 本身作为一种语言使异步编码更容易。如果您仍在使用 C# 2.0,那么异步语法是一个真正的痛苦。如果您定义 Action<>,许多开发人员只会感到困惑。和 Function<>到处都是并使用回调。以事件化方式编写的 ASP.NET 项目是普通 ASP.NET 开发人员无法维护的。
至于线程和内核。 Node.js 是单线程的,通过创建多 Node 进程来扩展。如果您有一个 16 核,那么您将运行 16 个 node.js 服务器实例,并在它前面有一个 Node.js 负载均衡器。 (如果需要,也可以是 nginx 负载均衡器)。
这一切都是从一开始就在非常低的级别写入平台的。这不是一些后来用 bolt 固定的功能。
其他优势
Node.js 比上面更多。以上只是为什么 Node.js 处理事件循环的方式比在 ASP.NET 中使用异步功能更好的原因。
关于asp.net - Node.js 的事件驱动有什么不同?我们不能在 ASP.Net 的 HttpAsyncHandler 中做到这一点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5599024/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道rubyonrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我很好奇.NET将如何影响Python和Ruby应用程序。用IronPython/IronRuby编写的应用程序是否会非常特定于.NET环境,以至于它们实际上将变得特定于平台?如果他们不使用任何.NET功能,那么IronPython/IronRuby相对于非.NET同类产品的优势是什么? 最佳答案 我不能说任何关于IronRuby的东西,但是大多数Python实现(如IronPython、Jython和PyPy)都试图尽可能忠实于CPython实现。不过,IronPython正在迅速成为这方面的佼佼者之一,并且在PlanetPyth
require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie
我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。
是否有适用于Ruby语言的.NETFramework编译器?我听说过DLR(动态语言运行时),这是否将使Ruby能够用于.NET开发? 最佳答案 IronRuby是Microsoft支持的项目,建立在动态语言运行时之上。 关于.net-是否有Ruby.NET编译器?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/199638/