加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

异步IO服务器:Thin(Ruby)和Node.js.有什么区别?

发布时间:2020-12-17 03:41:24 所属栏目:百科 来源:网络整理
导读:我想清除我的异步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.
我想清除我的异步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之间的代码就是这样
node.js正在编写异步方式(回调方法)
ruby是以同步方式编写的(但是在封面下以异步方式工作?是真的吗)

如果上述陈述属实,
似乎ruby更好,因为代码看起来更好而不是node.js中的一堆回调代码

套件

解决方法

Sinatra / Thin

Thin将以线程模式启动,
如果它是由Sinatra启动的(即使用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

让我们通过启动三个并发的http请求来测试它(在这里时间戳和thread-id是要观察的相关部分):

测试表明我们有三个不同的线程(每个cuncurrent请求一个),即:

> 70098572502680
> 70098572602260
> 70098572485180

它们中的每一个都是同时启动的(从puts语句的执行中我们可以看到启动是非常直接的),然后等待(休眠)十秒,然后刷新对客户端的响应(到卷曲过程).

更深刻的理解

引用wikipedia – Asynchronous_I/O:
在计算机科学中,异步I / O或非阻塞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中所做的那样,在处理开始时我们会添加一条日志行;
这里是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中启动三个并发请求并观察相同的行为:

当然与我们在前一个案例中看到的非常相似.

这一回应并未声称在该主题上是详尽无遗的,这一主题非常复杂,在为自己的目的得出结论之前值得进一步研究和具体证据.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读