Kit*_* Ho 4 ruby asynchronous thin nonblocking 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);
});
Run Code Online (Sandbox Code Playgroud)
我知道当node.js等待2秒的setTimeout时,它能够同时服务另一个请求,一旦传递2秒,它就会调用它回调函数.
在Ruby世界中,瘦服务器怎么样?
require 'sinatra'
require 'thin'
set :server, %w[thin]
get '/test' do
sleep 2 <----
"success"
end
Run Code Online (Sandbox Code Playgroud)
上面的代码片段使用的是瘦服务器(非阻塞,异步IO),在与异步IO通信时,我想询问何时到达sleep 2,是服务器能够在sleep 2阻止IO 的同时服务于另一个请求.
node.js和sinatra之间的代码是node.js正在编写异步方式(回调方法)ruby是以同步方式编写的(但是在封面下以异步方式工作?是真的)
如果上面的陈述是真的,似乎ruby更好,因为代码看起来更好而不是node.js中的一堆回调代码
套件
Thin将以线程模式启动,如果它由Sinatra启动(即with ruby asynchtest.rb)
这意味着您的假设是正确的; 当达到睡眠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
Run Code Online (Sandbox Code Playgroud)
让我们通过启动三个并发的http请求来测试它(在这里时间戳和thread-id是要观察的相关部分):
测试表明我们有三个不同的线程(每个cuncurrent请求一个),即:
它们中的每一个都同时启动(从puts语句的执行中可以看到启动是非常直接的),然后等待(休眠)十秒,然后在此之后刷新对客户端的响应(到卷曲过程).
引用维基百科 - 异步_I/O: 在计算机科学中,异步I/O或非阻塞I/O是一种输入/输出处理形式,允许在传输完成之前继续其他处理.
上面的测试(Sinatra/thin)实际上证明了可以从curl(客户端)到thin(服务器)启动第一个请求,并且在我们从第一个获得响应之前(在传输完成之前),可以启动第二个和第三个请求,这些持续请求不排队,但同时开始第一个或换句话说:允许其他处理继续*
基本上这是对@Holger的评论的确认:sleep会阻塞当前线程,但不会阻止整个过程.也就是说,在瘦,大多数东西都在主反应堆线程中处理,因此其工作方式类似于node.js中可用的一个线程:如果阻止它,则此线程中没有其他任何计划运行.在thin/eventmachine中,您可以将内容推迟到其他线程.
这个链接的答案有更多的细节:" is-sinatra-多线程和单线程仍然处理并发请求?
为了比较两个平台的行为,让我们asynchtest.js在node.js 上运行一个等价物; 正如我们所做的那样,我们会在asynchtest.rb处理开始时添加一条日志行; 这里的代码是asynchtest.rb:
var express = require('express');
var app = express();
app.get('/test', function(req, res){
console.log("[" + getTime() + "] logging /test starts\n");
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);
});
Run Code Online (Sandbox Code Playgroud)
让我们在nodejs中启动三个并发请求并观察相同的行为:

当然与我们在前一个案例中看到的非常相似.
这一回应并未声称在该主题上是详尽无遗的,这一主题非常复杂,在为自己的目的得出结论之前值得进一步研究和具体证据.
| 归档时间: |
|
| 查看次数: |
2296 次 |
| 最近记录: |