Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 1.9中的绿色线程?_Ruby_Multithreading - Fatal编程技术网

Ruby 1.9中的绿色线程?

Ruby 1.9中的绿色线程?,ruby,multithreading,Ruby,Multithreading,与Ruby1.8(MRI)不同,Ruby1.9使用本机线程 但是,是否可以请求Ruby 1.9.3创建一个绿色线程而不是本机线程 -- 我为什么要这样做? 用于测试目的 我正在尝试创建一个简单的TCP服务器,它将接受数千个并发连接,这些连接将在返回一些结果之前休眠几秒钟 在Ruby 1.8中,我可以轻松创建数千个线程,因此并发连接数的唯一限制是操作系统 在Ruby1.9中,这似乎是不可能的 这段代码演示了我的意思: require 'thread' m = Mutex.new c = 0 ta

与Ruby1.8(MRI)不同,Ruby1.9使用本机线程

但是,是否可以请求Ruby 1.9.3创建一个绿色线程而不是本机线程

--

我为什么要这样做?

用于测试目的

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

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

在Ruby1.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}
它在Ruby1.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中的线程模型现在使用本机线程,而绿色线程本身就不受欢迎


确切地了解一下为什么要使用绿色线程而不是操作系统管理的线程来建议合适的替代方案会很有帮助。根据您的使用案例,您可以考虑将Proc对象与您自己的调度或光纤作为本机线程的轻量级替代品一起使用。如果你发现线程的创建时间是一个限制因素,你也可以研究线程/光纤池。

光纤是不可能的吗?@pje更新了这个问题,你不能用该代码中的光纤替换线程,对吗?请注意,
setTimeout
sleep
完全不同<代码>设置超时计划函数在将来某个时间运行。这是一种异步、非阻塞的方法,而
sleep
将CPU在指定的时间内阻塞当前线程。@tabdulla是的,这就是我提到EventMachine的原因-它的
add_timer
应该与addTimeout相同,但我没有让它工作以获得答案-更新了我的问题。我不认为在我的情况下使用光纤是一种选择,或者是吗?我们应该在哪里看到这种变化?变更日志?