昨天我做了一些关于 nodeJS 的演讲。 有人问我以下问题:
As we know nodeJS is a single threaded server, several request is coming to the server and it pushes all request to event loop. What if two request is coming to server at exact same time, how server will handle this situation?
我猜到了一个想法并回复如下:
I guess No two http request can come to the server at exact same time, all request come through a single socket so they will be in queue. Http request has following format:
timestamp of request is contained in it's header and they may be pushed to the event loop depending upon their timestamp in header.
但我不确定我给他的答案是对还是错。
最佳答案
I guess No two http request can come to the server at exact same time, all request come through pipe so they will be in queue.
这部分基本正确。传入连接进入事件队列,其中一个必须首先放入队列。
What if two request is coming two server at exact same time, how server will handle this situation?
由于服务器在单个进程中的单个套接字上监听传入的 TCP 连接,因此不可能同时有两个传入连接。一个将由底层操作系统稍早于另一个进行处理。这样想。传入连接是网络连接上的一组数据包。其中一个传入连接将在另一个连接之前收到其数据包。
即使您有多个网卡和多个网络链接,因此两个传入连接实际上可以在同一时刻到达服务器,node.js 队列将通过互斥锁和其中一个传入连接来保护并发连接将先于其他连接获取互斥锁,并先于其他连接进入事件队列。
首先被操作系统处理的事件会先于另一个事件被放入 node.js 事件队列。当 node.js 可用于处理事件队列中的下一个项目时,事件队列中最先进入的请求将首先开始处理。
因为 node.js JS 执行是单线程的,请求的代码处理将运行其同步代码直至完成。如果它有一个异步操作,那么它将启动那个异步操作并返回。然后将允许处理事件队列中的下一个项目,第二个请求的代码将开始运行。它将同步运行到完成。与第一个请求一样,如果它有一个异步操作,那么它将启动该异步操作并返回。
此时,在两个请求都开始了它们的异步操作然后返回之后,就到了事件队列了。当其中一个异步操作完成时,它会将另一个事件发布到事件队列中,当 node.js 的单线程空闲时,它将再次处理事件队列中的下一个项目。如果两个请求都有很多异步操作,它们的进度可能会交错,并且在它们触发异步操作的同时都可能处于“飞行中”,然后返回直到异步操作完成,当 node.js 运行时它们的处理再次开始可以自由处理下一个事件。
timestamp of request is contained in it's header and they may be pushed to the event loop depending upon their timestamp in header.
这部分不太对。相同类型的传入事件在到达时添加到队列中。第一个到达的首先进入队列 - 没有任何检查时间戳的步骤。
关于node.js - 两个http请求能走到一起吗?如果可以,nodeJS 服务器如何处理它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40571109/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
是的,我知道最好使用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
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru