Tag: multithreading

为什么我会遇到僵局? 使用Thread,Queue和ActiveRecord。 Ruby 1.9.3,Rails 2.3.18

我通过运行多个线程并等待第一个线程以有效答案返回来缓解特定操作的低成功率。 我在下面创建了一个最小的示例: THREADS = [] if !defined?(THREADS) def threadtest THREADS.clear queue, mutex, result = Queue.new, Mutex.new, nil 10.times do |i| THREADS << Thread.new do counted = (10e6 + rand(10e6)).to_i.times { } # randomize computation time num = rand(8) # succeed only 1/8 of the time #mutex.synchronize do # even if wrapped in mutex # print […]

具有消费者线程和作业队列的Ruby Sinatra

我正在尝试创建一个非常简单的restful服务器。 当它收到请求时,我想在队列上创建一个新作业,当前线程向客户端返回响应时,该作业可由另一个线程处理。 我看着西纳特拉,但还没走得太远。 require ‘sinatra’ require ‘thread’ queue = Queue.new set :port, 9090 get ‘/’ do queue << 'item' length = queue.size puts 'QUEUE LENGTH %d', length 'Message Received' end consumer = Thread.new do 5.times do |i| value = queue.pop(true) rescue nil puts "consumed #{value}" end end consumer.join 在上面的例子中,我知道消费者线程只会运行几次(而不是应用程序的生命周期),但即使这样也不适用于我。 有更好的方法吗?

使用Soap4r在ruby中进行线程锁定

这与我在这里提出的问题有关: Ruby中的线程锁定(使用soap4r和QT) 然而,它特别针对该问题的一部分,并且由更简单的示例支持。 测试代码是: require ‘rubygems’ require ‘thread’ require ‘soap/rpc/standaloneserver’ class SOAPServer < SOAP::RPC::StandaloneServer def initialize(* args) super # Exposed methods add_method(self, 'test', 'x', 'y') end def test(x, y) return x + y end end myServer = SOAPServer.new('monitorservice', 'urn:ruby:MonitorService', 'localhost', 4004) Thread.new do puts 'Starting web services' myServer.start puts 'Ending web services' end sleep(4) #Thread.new […]

Ruby中的线程锁定(使用soap4r和QT)

[编辑注意:注意到我已将互斥锁创建放在构造函数中。 移动它并注意到没有变化。] [编辑注2:我在试运行中将调用更改为app.exec while TRUE do app.processEvents() puts ‘.” end 我注意到,一旦Soap4r服务开始运行,没有再次调用过程事件] [编辑注释3:在这里创建了一个相关的问题: 使用Soap4r在ruby中进行线程锁定 我正在尝试编写一个ruby程序,它接收SOAP命令以在监视器上绘制(从而允许远程监视器访问)。 我已经整理了一个简单的测试应用程序来构思这个想法。 图形工具包是QT。 我有我认为锁定的问题。 我已经添加了调用来测试服务器中显示的代码中的方法。 我正在测试的服务器端是: require ‘rubygems’ require ‘Qt4’ require ‘thread’ require ‘soap/rpc/standaloneserver’ class Box < Qt::Widget def initialize(parent = nil) super setPalette(Qt::Palette.new(Qt::Color.new(250,0,0))) setAutoFillBackground(true) show end end class SOAPServer < SOAP::RPC::StandaloneServer @@mutex = Mutex.new def initialize(* args) super # Exposed methods […]

交换例程共享互斥锁

我有a在一些随机时间重复调用的方法,它触发方法b ,它在一些随机时间之后完全执行并且在它自己的线程中。 我想确保等待的后续执行直到b完成,这是由当前执行的a触发a 。 换句话说, a和b将被替代地执行。 我尝试使用互斥和条件变量执行此操作,如下所示: def a Thread.new do $mutex.synchronize do puts “a” b $cv.wait($mutex) end end end def b Thread.new do sleep(rand) $mutex.synchronize do puts “b” $cv.signal end end end $mutex, $cv = Mutex.new, ConditionVariable.new loop{a; sleep(rand)} 在这段代码中, $mutex.synchronize do … end in方法a确保在$cv.wait($mutex)之前不会调用方法b中的$cv.signal (也在另一个$mutex.synchronize do … end ) $cv.wait($mutex)将$cv设置为信号的聆听模式。 这在文件中给出了很多。 我打算分配给$mutex.synchronize do […]

为什么puts方法在线程中使用时表现得很奇怪?

解决方案:在.irbc文件中,输入: IRB.conf[:USE_READLINE] = false 我正在运行一些ruby代码: Thread.new do loop do a = @queue.pop puts “1” puts “2” end end 当我在irb中运行它并且队列弹出时,它会打印“1”,但不会立即打印“2”。 在吐出“2”之前,我必须按几次输入。 这是为什么? 这是我的irb日志: >> Thread.new do ?> loop do ?> a = @queue.pop >> puts “1” >> puts “2” >> end >> end => # >> @queue < # >> ?> ?> ?> 2?> 这是我得到的: >> […]

如何从模型回调中捕获在不同线程上引发的rsolr Sunspotexception?

即使我可以捕获从@ post.save引发的exception并记录错误并打印线程 begin if @post.save rescue Exception => ex # rescue Errno::ECONNREFUSED => ex Thread.list.each {|t| pt} Rails.logger.error “ERROR: Could not save blog post! Is the Solr server up and running? Exception: #{ex}” 它仍然在网页上出错,并且不会在堆栈跟踪中显示我的任何代码。 solr Sunspot模型回调在一个单独的线程上运行。 rsolr (1.0.9) lib/rsolr/connection.rb:19:in `rescue in execute’ rsolr (1.0.9) lib/rsolr/connection.rb:14:in `execute’ … sunspot_rails (2.1.0) lib/sunspot/rails/solr_instrumentation.rb:15:in `send_and_receive_with_as_instrumentation’ (eval):2:in `post’ rsolr (1.0.9) […]

如何使用rspec测试multithreadingTCPServer

我写了一个非常简单的日期服务器: require ‘socket’ s = TCPServer.new 3939 while (conn = s.accept) Thread.new(conn) do |c| c.print “Enter your name: ” name = c.gets.chomp c.puts “Hi #{name}, the date is…” c.print `date` c.close end end 用户连接,产生一个线程,他们输入他们的名字,返回日期。 简单。 我想知道如何在rspec中测试这样的东西。 我有过的一些想法:1。)使用VCR记录服务器连接,使用Timecop冻结并返回日期。 2.)在之前的块中连接到实际的服务器。 我不完全确定如何执行此操作,因为当我运行rspec时,我认为它实际上运行服务器…或者发生了一些事情,终端只是冻结并等待某些东西……示例测试代码: before @server = TCPSever.new 3939 end it “does something..” conn = @server.accept # etc end after […]

rails中的’deadlock detected’错误

我的代码中检测到死锁错误,并且不明白为什么。 有人可以告诉我,我做错了什么? #!/usr/bin/ruby ENV[‘RAILS_ENV’] = ARGV.first || ENV[‘RAILS_ENV’] || ‘development’ require File.expand_path(File.dirname(__FILE__) + “/config/environment”) mutex = Mutex.new threads = [] 1.upto(10) do |i| threads << Thread.new(i) do |id| mutex.synchronize do # here I want to take 1 record from "class Product < ActiveRecord::Base" Product.first end # and to do here some stuff with it # […]

MRIruby穿线和性能

关于SO的第一个问题,但我已经潜伏了很长时间,所以如果我违反任何规则或发布垃圾问题,你将不得不原谅我。 我正在努力更好地理解线程,我决定测试MRI,看看它的表现如何。 给定以下代码(和输出),为什么线程操作比非线程变体慢得多? 码 class Benchmarker def self.go puts ‘———-Benchmark Start———-‘ start_t = Time.now yield end_t = Time.now puts “Operation Took: #{end_t – start_t} seconds” puts ‘———-Benchmark End————‘ end end # using mutex puts ‘Benchmark 1 (threaded, mutex):’ Benchmarker.go do array = [] mutex = Mutex.new 5000.times.map do Thread.new do mutex.synchronize do 1000.times do array […]