与 Ruby 1.8 (MRI) 不同,Ruby 1.9 使用本机线程。
但是是否可以请 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}
它在 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/');
如果有人可以用 EventMachine 证明同样的事情,我会很高兴接受这个答案。