Ruby 1.9中的绿色线程是什么?

3

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}

它在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演示相同的操作,我会很高兴接受这个答案。

纤程是不可能的吗? - pje
@pje 更新了问题,你不能在那段代码中用纤程来替换线程,对吗? - Oleg Mikheev
请注意,setTimeoutsleep完全不同。setTimeout会在未来的某个时间安排一个函数运行。它是一种异步、非阻塞的方法,而sleep会在指定的时间内CPU阻塞当前线程。 - tabdulla
@tabdulla 是的,这就是为什么我提到了EventMachine - 它的 add_timer 应该和 addTimeout 一样,但是我没有成功让它工作。 - Oleg Mikheev
1个回答

6
简而言之,答案是否定的。1.9中的线程模型现在使用本机线程,绿色线程被本身弃用。
要提供建议的适当替代方案,最好听到您想使用绿色线程而不是操作系统管理的线程的确切原因。根据您的用例,您可以考虑使用例如带有某种自定义调度的对象或<纤维>作为本地线程的轻量级替代方案。如果您发现线程创建时间是一个限制因素,您还可以查看线程/纤维池。

谢谢你的回答 - 我已经更新了我的问题。我不认为在我的情况下使用Fibers是一个选项,或者说它是吗? - Oleg Mikheev
我们应该在哪里查看这些更改?更新日志? - Franzé Jr.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接