Tag: 并发

在Ruby on Rails中,线程,并发和分叉进程的当前状态是什么?

Ruby on Rails不能很好地执行multithreading请求响应,或者至少ActiveRecord没有。 在创建Web应用程序时,只有一个请求响应同时处于活动状态的概念可能会很麻烦,这些应用程序会分离一个需要很长时间才能完成的shell命令。 我想要的是你对这些设置的一些看法? Rails可能不适合某些应用程序吗? 另外,Ruby on Rails中关于并发性的当前事态是什么? 什么是最佳实践。 有缺点的解决方法吗?

同时检查数据库中多个URL的URL(状态即200,301,404)的最佳方法

这就是我想要完成的事情。 假设我有100,000个url存储在数据库中,我想检查每个URL的http状态并存储该状态。 我希望能够在相当短的时间内同时完成这项工作。 我想知道这样做的最佳方式是什么。 我考虑过与工人/消费者或某种模型一起使用某种队列,但我真的没有足够的经验来了解在这种情况下哪种方法最有效。 想法?

Rubymultithreading性能问题

我正在构建Ruby应用程序。 我有一组想要灰度的图像。 我的代码过去是这样的: def Tools.grayscale_all_frames(frames_dir,output_dir) number_of_frames = get_frames_count(frames_dir) img_processor = ImageProcessor.new(frames_dir) create_dir(output_dir) for i in 1..number_of_frames img_processor.load_image(frames_dir+”/frame_%04d.png”%+i) img_processor.greyscale_image img_processor.save_image_in_dir(output_dir,”frame_%04d”%+i) end end 在线程代码之后: def Tools.greyscale_all_frames_threaded(frames_dir,output_dir) number_of_frames = get_frames_count(frames_dir) img_processor = ImageProcessor.new(frames_dir) create_dir(output_dir) greyscale_frames_threads = [] for frame_index in 1..3 greyscale_frames_threads << Thread.new(frame_index) { |frame_number| puts "Loading Image #{frame_number}" img_processor.load_image(frames_dir+"/frame_%04d.png"%+frame_number) img_processor.greyscale_image img_processor.save_image_in_dir(output_dir,"frame_%04d"%+frame_number) puts "Greyscaled Image #{frame_number}" } […]

Rails消耗外部API需要交错消费

我正在使用外部服务来搜索我的应用程序。 此搜索的结果需要从多个合作伙伴处收集,并需要10到90秒才能完成。 在收集结果的同时,我反复轮询我的搜索会话以收集已经准备好的结果。 当我有新的结果时,我会通过SSE将它们转移到客户端。 我每5秒左右轮询一次。 我怎么能运行这个过程而不用绝对地训练我的一个线程90秒(运行puma + nginx)。 我需要保持我的控制器状态,将SSE推送到请求客户端,并且不确定处理民意调查之间延迟的最佳方法。 非常感激

什么是Ruby相当于Python的多处理模块?

为了在Ruby或Python中获得真正的并发性,我需要创建新的进程。 Python使用multiprocessing模块使这非常简单,它模糊了所有的fork / wait优点,让我专注于我的代码。 Ruby有类似的东西吗? 现在我调用Process.fork和Process.wait来获得并发性,我想要一个更清晰的解决方案。

Ruby Fibers可以并发吗?

我试图在我的程序中加快速度,并且我被告知Ruby Fibers比线程更快,并且可以利用多个核心。 我环顾四周,但我找不到如何实际同时运行不同的纤维。 使用线程,您可以执行此操作: threads = [] threads << Thread.new {Do something} threads << Thread.new {Do something} threads.each {|thread| thread.join} 我看不出怎么用纤维做这样的事情。 我所能找到的只是yield和resume ,这似乎只是一堆起始和停止在纤维之间。 有没有办法与光纤进行真正的并发?

即使只有一个线程在线程池中,并发会发生并发吗?

我正在使用Rails 5和Ruby 2.4。 我怎么能弄明白,或者你能看出下面的内容,是否有多个线程在同一时间运行? pool = Concurrent::FixedThreadPool.new(1) promises = links.map do |link| Concurrent::Promise.execute(executor: pool) do result = process_link(link) if result if result.kind_of?(Array) result.each do |my_obj| my_obj.update_attributes({ :a => a }) records_processed = records_processed + my_obj.matches.count end else records_processed = records_processed + result.matches.count result.update_attributes({ :a => a }) end end end end promises.map(&:wait).map(&:value!) 由于我已将我的池设置为“1”,我的假设是没有任何内容同时运行,但我一直收到此错误… Error during […]

Ruby 1.9.1中的原生线程,对我来说是什么?

因此,Ruby 1.9.1现在声明稳定 。 Rails应该可以使用它,慢慢地将gem移植到它上面。 它具有本机线程和全局解释器锁(GIL)。 由于GIL到位,在1.9.1中本机线程是否比绿色线程提供任何好处?

异步发出多个HTTP请求

require ‘net/http’ urls = [ {‘link’ => ‘http://www.google.com/’}, {‘link’ => ‘http://www.yandex.ru/’}, {‘link’ => ‘http://www.baidu.com/’} ] urls.each do |u| u[‘content’] = Net::HTTP.get( URI.parse(u[‘link’]) ) end print urls 此代码以同步方式工作。 第一个请求,第二个,第三个。 我想异步发送所有请求并在完成所有请求后打印urls 。 最好的办法是什么? 纤维适合那吗?