Ruby 1.9中的绿色线程?

Ole*_*eev 3 ruby multithreading

Ruby 1.9使用本机线程,与Ruby 1.8(MRI)不同.

但是,是否可以请求Ruby 1.9.3创建绿色线程而不是本地线程?

-

我为什么要这样?

用于测试目的.

我正在尝试创建一个简单的TCP服务器,它可以接受数千个并发连接,这些连接在返回一些结果之前会休眠几秒钟.

在Ruby 1.8中,我可以轻松创建数千个线程,因此并发连接数量的唯一限制是操作系统.

在Ruby 1.9中似乎是不可能的.

这段代码演示了我的意思:

require 'thread'

m = Mutex.new
c = 0
ta = Array.new 10000

ta.fill do
  Thread.new do
    m.synchronize { c += 1; p "created #{c}th" if c%100 == 0; }
    sleep 15
    m.synchronize { c -= 1; p "destroyed #{c+1}th" if c%100 == 0; }
  end
end

ta.each {|t| t.join}
Run Code Online (Sandbox Code Playgroud)

它在Ruby 1.8中运行良好,但在1.9中它非常糟糕.

-

不幸的是,在使用eventmachine进行一些实验后,add_timer我能想到的最好的是Node.js服务器:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  setTimeout(function() {res.end('Hello World\n');}, 10000 );
}).listen(8081, '127.0.0.1');
console.log('Server running at http://127.0.0.1:8081/');
Run Code Online (Sandbox Code Playgroud)

如果有人能用EventMachine演示同样的东西,我很乐意接受这个答案.

小智 6

简而言之,答案是否定的.1.9中的线程模型现在使用本机线程,本身不推荐使用绿色线程.

如果您想要使用绿色线程而不是操作系统管理的线程来建议正确的替代方案,那将会很有帮助.根据您的使用情况,您可以考虑使用具有某种滚动自己的调度的Proc对象或者作为本机线程的轻量级替代的Fibers.如果您发现线程的创建时间是限制因素,您还可以查看线程/光纤池.