From: Joel VanderWerf Date: 2005-08-10T10:16:05+09:00 Subject: Re: drb server using file/tail to read file, and update client? Joel VanderWerf wrote: > Ryan Leavengood wrote: > >>Christopher Aldridge said: >> >> >>>Any suggestions or am I doing it the only way it can be done? >> >> >>If I understand your problem correctly, the issue is that you now have to >>constantly poll the server to see if there are more lines, when really >>what you want is to have the server tell the clients of the new lines. >> >>So your options are either to code the clients so they also have a DRb >>server, which the server connects to when outputting lines from the log >>file, or possible to use Rinda and a Tuplespace. > > > IIRC, the client can also call a method with a block. The block is > undumped, so it remains on the client side, with a proxy on the server > side. When the server's implementation of the method yields to the > block, it calls the code on the client side. DRb is sooo elegant! > > An example of that idea is embedded in a little distributed chat server > example that comes with my foxtails project, using distributed observers > wired up to fox gui widgets. But it's probably easier to code this up > from scratch, once you know that DRb supports distributed block yields. > Here is an example of using callbacks by yielding from the server: ==== svr.rb ==== require 'drb' $callback = nil class C def foo 3.times do |i| yield i end end def bar(&pr) $callback = pr end end obj = C.new DRb.start_service('druby://:22337', obj) begin loop do $callback.call if $callback sleep 1 end rescue DRb::DRbConnError puts "client is gone" end ========= ==== clnt.rb ==== require 'drb' DRb.start_service() obj = DRbObject.new_with_uri('druby://:22337') obj.foo do |i| p i end obj.bar do puts "Got callback!" end puts "press return to quit" gets ======== output: 0 1 2 press return to quit Got callback! Got callback! Got callback! Got callback! -- vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407