异步IO服务器:Thin(Ruby)和Node.js.有什么区别?
我想清除我的异步IO,非阻塞服务器的概念
在处理Node.js时,很容易理解这个概念 var express = require('express'); var app = express(); app.get('/test',function(req,res){ setTimeout(function(){ console.log("sleep doesn't block,and now return"); res.send('success'); },2000); }); var server = app.listen(3000,function() { console.log('Listening on port %d',server.address().port); }); 我知道当node.js等待2秒的setTimeout时,它能够同时服务另一个请求,一旦传递2秒,它就会调用它回调函数. 在Ruby世界中,瘦服务器怎么样? require 'sinatra' require 'thin' set :server,%w[thin] get '/test' do sleep 2 <---- "success" end 上面的代码片段使用的是瘦服务器(非阻塞,异步IO),当与异步IO交谈时,我想问到达到睡眠2时,服务器是否能够在睡眠2的同时提供另一个请求阻止IO. node.js和sinatra之间的代码就是这样 如果上述陈述属实, 套件 解决方法
Sinatra / Thin
Thin将以线程模式启动, 这意味着您的假设是正确的;当达到睡眠2时,服务器能够同时服务另一个请求,但是在另一个线程上. 我想通过一个简单的测试来显示这种行为: #asynchtest.rb require 'sinatra' require 'thin' set :server,%w[thin] get '/test' do puts "[#{Time.now.strftime("%H:%M:%S")}] logging /test starts on thread_id:#{Thread.current.object_id} n" sleep 10 "[#{Time.now.strftime("%H:%M:%S")}] success - id:#{Thread.current.object_id} n" end 让我们通过启动三个并发的http请求来测试它(在这里时间戳和thread-id是要观察的相关部分): 测试表明我们有三个不同的线程(每个cuncurrent请求一个),即: > 70098572502680 它们中的每一个都是同时启动的(从puts语句的执行中我们可以看到启动是非常直接的),然后等待(休眠)十秒,然后刷新对客户端的响应(到卷曲过程). 更深刻的理解 引用wikipedia – Asynchronous_I/O: 上面的测试(Sinatra / thin)实际上证明了可以从curl(客户端)开始第一个请求瘦(服务器) 基本上这是@Holger只是注释的确认:sleep会阻塞当前线程,但不会阻止整个过程.也就是说,在瘦,大多数东西都在主反应堆线程中处理,因此其工作方式类似于node.js中可用的一个线程:如果阻止它,则此线程中没有其他任何计划运行.在thin / eventmachine中,您可以将内容推迟到其他线程. 这个链接的答案有更多细节:“is-sinatra-multi-threaded和Single thread still handles concurrency request? Node.js的 为了比较两个平台的行为,让我们在node.js上运行一个等价的asynchtest.js;正如我们在asynchtest.rb中所做的那样,在处理开始时我们会添加一条日志行; var express = require('express'); var app = express(); app.get('/test',res){ console.log("[" + getTime() + "] logging /test startsn"); setTimeout(function(){ console.log("sleep doen't block,and now return"); res.send('[' + getTime() + '] success n'); },10000); }); var server = app.listen(3000,function(){ console.log("listening on port %d",server.address().port); }); 让我们在nodejs中启动三个并发请求并观察相同的行为: 当然与我们在前一个案例中看到的非常相似. 这一回应并未声称在该主题上是详尽无遗的,这一主题非常复杂,在为自己的目的得出结论之前值得进一步研究和具体证据. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c#中没有类名的新关键字
- 在swift中制作简单的手风琴TableView?
- 正则表达式 – 为什么字符范围类[A-z]匹配下划线?
- .net – 什么是NSubstitute的限制,特别是对最小起订量?
- c# – 代码合同:我们必须在委托方法中冗余地指定Contract.
- c# – 当valueFactory有副作用时,ConcurrentDictionary.Get
- reactjs – react-router中的嵌套路由
- 免费不容错过!斯坦福Swift教程又来啦
- swfupload uploadSuccess Uploading... 的问题解决
- ListView 使用自定义适配器,将自定义xml布局转换成view调整