Joel VanderWerf
10/13/2008 7:20:00 PM
Thomas B. wrote:
> Bryan Richardson wrote:
>> Hello all,
>>
>> I have a long running Ruby simulation in which data is stored to Ruby
>> hashes throughout the simulation. I'd like to be able to access the
>> hashes in memory from another Ruby script while the simulation is still
>> running to see what the progress of the simulation is (rather than
>> printing to the screen, using log4r, etc. Is this possible? If so, any
>> suggestions how to do so?
>
> Hello. I guess this is not possible, and even if it is, it is not a good
> idea to do this. Probably a much better idea would be to start a TCP
> server in the daemon, and connect to it from the other program, and
> communicate using some simple protocol. Another idea could be to write
> some progress info into a file, and open the file from the other
> process, but then you'll have to handle some concurrency problems (not
> very hard, I guess, it will be enough to wait a moment and retry on file
> opening failure). But still I think the server is a better and more
> standard way to do this. Have a look at TCPServer and TCPSocket in
> 'socket', it is not hard.
DRb is the canonical way of doing this if both processes are ruby
programs. For example:
== server.rb ==
require 'drb'
uri = "drbunix:/tmp/my-simulation.sock" # use "localhost:4444" on win
h = {1=>2, 3=>4}
DRb.start_service(uri, h)
DRb.thread.join
== client.rb ==
require 'drb'
uri = "drbunix:/tmp/my-simulation.sock" # use "localhost:4444" on win
DRb.start_service(nil, nil)
server_object = DRbObject.new(nil, uri)
p server_object.keys
server_object.each do |k, v|
p [k, v]
end
================
Output:
[1, 3]
[1, 2]
[3, 4]
--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407