From: Joel VanderWerf Date: 2010-03-23T02:36:03+09:00 Subject: [ruby-core:28868] Re: Can DRb be used across a fork() Chris Schlaeger wrote: > I'm trying to use DRb to communicate between a parent and child > processes. The DRb server is started before I fork-off the children. > When I connect back from the child to the parent DRb server, I only > seem to talk to a zombie copy of the DRb server in the child. > > The attached program demonstrates the problem. Is that a bug or is DRb > not designed to work across a fork? > > With current ruby 1.9.2 I get the following output: > > #ruby19 drb_over_fork.rb > 13151: Parent > 13155: Child > 13155: a: 1 > 13155: A: 1 > 13151: A: 0 > > Chris There are a couple of subtleties. See if this helps: require 'drb' class Foo attr_reader :a def initialize @a = 0 end def inc @a += 1 debug "a: #{@a}" end end def debug(msg) puts "#{Process.pid}: #{msg}" end foo = Foo.new uri = DRb.start_service(nil, foo).uri unless (pid = fork) DRb.start_service() # Because parent's DRb thread dies across fork debug 'Child' # child foo_c = DRbObject.new(nil, uri) # This call modifies a copy of foo in the child, not the parent foo! foo_c.inc debug "A: #{foo_c.a}" else debug 'Parent' Process.wait debug "A: #{foo.a}" end __END__ The output I get (1.8.6) is $ ruby drb_over_fork.rb 17245: Parent 17246: Child 17245: a: 1 17246: A: 1 17245: A: 1