Forum: Italian Ruby user group Problema con RINDA

Posted by Gino Farci (slayer)
on 2010-08-20 12:21
Salve  mi aiutereste a capire?
Probabilmente sto facendo un errore grossolano ma non riesco a vederlo ,
allora io sto cercando di implemntare una mia interpretazione del
l'algoritmo produttore/cosumatore usando Rinda .
Ho creato una classe server che farà partire un server_ring ed sara
eseguito in thread , una classe provider che registra la tupla ,una
classe produttore e una consumatore.
A prescindere dal funzionamento di tale algoritmo noto che quando vado a
fare il take sebra che non riesca a leggere dallo spazio delle tuple
quindi mancando il matching.
Non riesco a comprendere l'errore se qualcuno di voi mi puo aiutare
grazie!!Sono su questa cosa da 2 gg probabilmente sto facendo una
cappellata e non me ne sto accorgendo ma sono alla frutta.

----server

require 'rinda/ring'
require 'rinda/tuplespace'

class Tupleserver
  def initialize
  end
  def start
    DRb.start_service
    ts = Rinda::TupleSpace.new
    Rinda::RingServer.new ts
    DRb.thread.join;
  end
end

----Provider

 require 'rinda/ring'
 require 'rinda/tuplespace'
class Provider
  def initialize
  end
  def start
    DRb.start_service
    ts = Rinda::TupleSpace.new
    prov = Rinda::RingProvider.new :TupleSpace, ts, 'Tuple Space'
    prov.provide;
    DRb.thread.join
  end
end

----Consumer

require 'rinda/ring'
require 'rinda/tuplespace'
class Consumer
  def initialize
    DRb.start_service
    ring_server = Rinda::RingFinger.primary
    ts = ring_server.read([:name, :TupleSpace, nil, nil])[2]
    @ts = Rinda::TupleSpaceProxy.new ts
    @buff=0;
  end
  def execute
    while true
      puts "eccomi sono il consumatore"
      @buff=@ts.take([:ciao,nil,nil])[2]
      if(@buff!=0)
        @buff=@buff.to_i-1;
        @ts.write[:ciao,@buff];
      end
      puts "vuoto";
      @ts.write([:ciao,'empty',nil]);
    end
  end
end

----Producer

require 'rinda/ring'
require 'rinda/tuplespace'
class Producer
  def initialize
    DRb.start_service
    ring_server = Rinda::RingFinger.primary
    ts = ring_server.read([:name,:TupleSpace, nil, nil])[2]
    @ts = Rinda::TupleSpaceProxy.new ts
    @buff=0;
  end
  def execute
    while true
      while @buff!=10
        @buff=@buff.to_i+1;
      end
      puts "avverto che è pieno"
      @ts.write([:TupleSpace,@buff,nil]);
      puts"aspetto che sia vuoto"
      @ts.take([:TupleSpace,'empty',nil])[1];
      @buff=0;
    end
  end
end


----Main
require 'rinda/ring'
require 'rinda/tuplespace'
require "Tupleserver";
require "Producer";
require "Consumer";
require "Provider"
require "Searchservice"

server=Tupleserver.new;
Thread.new{server.start()};
provider=Provider.new;
Thread.new{provider.start()}
Searchservice.new;
producer=Producer.new;
consumer1=Consumer.new;
consumer2=Consumer.new;
t1=Thread.new{producer.execute()};
t2=Thread.new{consumer1.execute()};
t3=Thread.new{consumer2.execute()};
t1.join;
t2.join;
t3.join;
Posted by Gino Farci (slayer)
on 2010-08-20 13:56
ho sbagliato a postare il codice della calsse producer ecco quello 
giusto:

require 'rinda/ring'
require 'rinda/tuplespace'
class Consumer
  def initialize
    DRb.start_service
    ring_server = Rinda::RingFinger.primary
    ts = ring_server.read([:name, :TupleSpace, nil, nil])[2]
    @ts = Rinda::TupleSpaceProxy.new ts
    @buff=0;
  end
  def execute
    while true
      puts "eccomi sono il consumatore"
      @buff=@ts.take([:TupleSpace,nil,nil])[2]
      if(@buff!=0)
        @buff=@buff.to_i-1;
        @ts.write[:TupleSpace,@buff];
      end
      puts "vuoto";
      @ts.write([:TupleSpace,'empty',nil]);
    end
  end
end
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.