Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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中使用线程进行度量收集会带来很大的开销吗?_Ruby_Multithreading - Fatal编程技术网

在Ruby中使用线程进行度量收集会带来很大的开销吗?

在Ruby中使用线程进行度量收集会带来很大的开销吗?,ruby,multithreading,Ruby,Multithreading,我有一个收集和分析使用指标的服务器。我希望我的体系结构的各个部分通过RESTAPI定期向服务器发送度量 我不想在传输度量时阻止执行,所以我考虑过创建一个方法来剥离线程: require 'net/http' module Metrics def self.time(time_to_process) Thread.new do uri = URI.parse(url) http = Net::HTTP.new(uri.host, uri.port)

我有一个收集和分析使用指标的服务器。我希望我的体系结构的各个部分通过RESTAPI定期向服务器发送度量

我不想在传输度量时阻止执行,所以我考虑过创建一个方法来剥离线程:

require 'net/http'

module Metrics
  def self.time(time_to_process)
    Thread.new do
      uri = URI.parse(url)
      http = Net::HTTP.new(uri.host, uri.port)
      # ...do a bunch of setup...
      response = http.request(request)
    end
  end
end
…以及应用程序内部

def app_method
  # ...do stuff, measure time
  Metrics.time(time_to_process)
end
由于应用程序代码是单线程的,执行app_方法需要一到两秒钟的时间,因此我预计任何时候都不会有超过10-100个metric collection线程在运行,因此操作系统线程限制不是一个大问题


然而,我想知道在内存和CPU时间方面,剥离新线程的开销是多少(不包括实际执行Net::HTTP调用所需的内存/CPU)?这种方法有显著的缺点吗?

简短的回答是肯定的-启动一个新的临时线程具有非常显著的内存和CPU开销

避免在需要执行后台作业时创建新线程的行业标准是使用,它只是预先创建的若干线程,等待接收消息并相应地执行工作

查看类似的解决方案(如),大多数使用后台进程(或代理),负责将信息实际发送到服务器,而应用程序向代理发送轻量级消息,并在方便时聚合和批量发送


在Rails系统中,不建议从头开始创建后台作业,并且应该考虑使用GEM类,以及它的建议架构来为您这样做。大多数应用程序也不依赖于主应用程序中的线程,而是依赖于它们自己的进程(有时在它们自己的机器上),通过队列上的消息与应用程序通信(例如使用存储库)。

我认为新线程的用例实际上相当不错。我已经创建了新的线程,以允许应用程序快速响应,并在后台执行一些操作

正如Uri在回答中提到的,更健壮和可伸缩的方法是使用后台工作程序,比如Sidekiq。但这需要更多的开销和复杂性

一个重要的考虑因素是失败。如果后台作业失败,您希望发生什么?登录中?重新启动?如果答案是重启或一些更复杂的功能,那么像Sidekiq这样的后台工作者可能会更好

关于资源,我不认为启动一个新线程会消耗很多资源。但这取决于您的用例。一次1个新线程不会被注意到,但100个可能太多了。每个线程将消耗多少CPU和资源

NewRelic是一个很好的测试方法,可以监测你的应用程序的CPU和内存使用情况


这里有一些有趣的信息应该是有用的:

Bummer,我真的不喜欢在堆栈中添加另一个依赖项,比如DJ。我打算尝试一下没有线程池的情况,因为我预计在任何时候只有3到4个线程在运行。我们将看到发生了什么顺便问一下,内存方面的开销究竟是多少?在谷歌上搜索,我没有看到任何具体的信息numbers@juwiley我不知道这些数字,但是如果你坚持使用ad-hoc线程,你可能需要考虑纤维——你说“代码>内存和CPU开销是什么意思?”代码>?这并不能提供太多的信息。