Tag: multithreading

Rails并发请求

所以我有一个rails应用程序来解析一个很长的json文件 – 在此期间它会向外部API发送请求,这似乎需要永远。 我的问题是,将每个请求粘贴到一个单独的线程中是为了加快速度吗? 我不明白为什么我不能说3个或4个线程同时运行发送请求…我看到的唯一问题是当前该方法显示错误页面,如果在解析结束时出现任何错误 – 并且这可能不会发生,因为其他线程可能仍在运行? ..最终我想把这个方法变成一个rake任务并使用一个呈现html页面的cron作业运行它,以便更好地纠正? def load_movies @errors = [] movie_list = get_data movie_list.first(50).each do |movie_data| ———— Thread.new do ———– movie = Movie.new movie.construct_movie movie_data if !movie.valid? @errors < 0 redirect_to root_path end end 它是否像上面那样简单,它将运行打开多个线程来发送请求(可以假设在construct_movie中)

为什么退出Ruby线程会杀死我的整个程序?

我有这段代码: puts “Start” loop do Thread.start do puts “Hello from thread” exit end text = gets puts “#{text}” end puts “Done” 我期望看到“开始”后跟“线程中的Hello”,然后我可以输入回复给我的输入。 相反,我得到“开始”和“来自线程的Hello”,然后程序退出。 从exit文档: 终止thr并调度另一个要运行的线程。 如果此线程已被标记为被杀死,则exit返回Thread。 如果这是主线程或最后一个线程,则退出进程。 但我以为我催生了一个新线程? 为什么退出我的主流程?

Ruby 1.9.3中的并行测试有多平行?

在Ruby 1.9.3中, 您可以一次运行多个测试用例 。 我不确定这是该语言的function,最小的库,还是YARV的一个function,所以对任何不好的术语表示道歉。 但是他们为此消除了GVL,或者这仅仅意味着如果一个线程在做IO,另一个线程可以利用CPU吗?

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推送到请求客户端,并且不确定处理民意调查之间延迟的最佳方法。 非常感激

为什么我在线程中无法访问某些库类?

为什么如下 require “bio” threads = (1..2).map do Thread.new do seqs = [“gattaca”] * 5 alignment = Bio::Alignment.new(seqs) end end threads.each {|th| th.join} ; nil 给出此错误消息? NameError: uninitialized constant Bio::Alignment from (irb):6 from (irb):10:in `join’ from (irb):10 from (irb):10:in `each’ from (irb):10

无法使套接字接受非阻塞ruby 2.2

我一直在寻找socket接受非阻塞。 我发现recv没有阻塞,但无论如何这对我没有好处。 我的脚本首先启动一个新的套接字类。 它使用ip 127.0.0.1和端口6112绑定到客户端。然后它启动multithreading。 multithreading需要@sock.accept。 “那就是封锁。 然后我使用了accept_nonblock。 虽然,这会给我带来以下错误: IO::EWOULDBLOCKWaitReadable : A non-blocking socket operation could not be completed immediately. – accept(2) would block 我使用的是Ruby 2.2。 注意:我不打算使用Rails来解决我的问题,或者给我一个捷径。 我坚持使用纯Ruby 2.2。 这是我的脚本: require ‘socket’ include Socket::Constants @sock = Socket.new(AF_INET, SOCK_STREAM, 0) @sockaddr = Socket.sockaddr_in(6112, ‘127.0.0.1’) @sock.bind(@sockaddr) @sock.listen(5) Thread.new(@sock.accept_nonblock) do |connection| @client = Client.new(ip, connection, self) @clients.push(@client) begin […]

如何捕获Ruby中的按键?

在Ruby中,我需要一个简单的线程,每次按下一个键时都会运行一些代码。 有没有办法做到这一点? 我需要能够捕获Page Up和Page Down 这是我尝试过的: #!/usr/bin/env ruby Thread.new do while c = STDIN.getc puts c.chr end end loop do puts Time.new sleep 0.7 end 这几乎可行。 只有一个问题,每个击键后都需要回击。 我想这是因为缓冲的IO。

单线程仍然处理并发请求?

Ruby进程是单线程。 当我们使用瘦服务器启动单个进程时,为什么我们仍然能够处理并发请求? require ‘sinatra’ require ‘thin’ set :server, %w[thin] get ‘/test’ do sleep 2 <—- "success" end 什么是瘦内部可以处理并发请求? 如果是由于事件 – 机器框架,上面的代码实际上是一个不用于EM的同步代码。

是使用线程和ruby机械化安全吗?

有没有人看到过很多像这样的错误: Exception `Net::HTTPBadResponse’ at /usr/lib/ruby/1.8/net/http.rb:2022 – wrong status line: _SOME HTML CODE HERE_ 使用线程和机械化时? 我相对肯定这是线程和net/http库之间的一些不良行为,但是当使用mechanize / nethttp时,是否有人对你想要立即运行的线程的上限有任何建议? 我如何捕获这种exception,因为rescue Net::HTTPBadResponse不起作用?