gpt4 book ai didi

ruby - Ruby 1.9 中的绿色线程?

转载 作者:数据小太阳 更新时间:2023-10-29 07:50:31 24 4
gpt4 key购买 nike

与 Ruby 1.8 (MRI) 不同,Ruby 1.9 使用 native 线程。

但是否可以请 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 证明同样的事情,我很乐意接受这个答案。

最佳答案

简而言之,答案是否定的。 1.9 中的线程模型现在使用 native 线程,并且绿色线程本身已被弃用。

准确了解您为什么要使用绿色线程而不是操作系统管理的线程来建议合适的替代方案会很有帮助。根据您的用例,您可以考虑使用例如具有某种滚动您自己的调度的 Proc 对象或 Fibers 作为 native 线程的轻量级替代品。如果您发现线程的创建时间是一个限制因素,您还可以查看线程/纤程池。

关于ruby - Ruby 1.9 中的绿色线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12927724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com