Hi all,
           I'm updating some parallel Julia code to support 0.5. I see that 
the RemoteRef type is no longer supported. It seems I need to replace these 
with a mix of Future and RemoteChannel. The use of Future is clear enough 
but I'm unclear on the best way to use RemoteChannels, in the following 
context: Suppose I want to initialize an instance of some complicated 
composite type MyBigType on a remote worker. Later on I want to modify that 
instance, use it for some computations and continue storing it for another 
later use. On julia 0.4 I can do

  R = RemoteRef{Channel{Any}}
  R = remote_call(pid,constructMyBigType,arguments)

a can then be a reusable storage location, i.e. one can do things like
  Rval = take!(R)
  Rval = computeSomething(Rval) #Modifies some fields of aval, leaves 
others untouched
  put!(R,Rval)

That doesn't work on 0.5. since the RemoteRef type is gone. So far, my 
solution is to first send all arguments needed by the constructor function 
to the remote worker, then define a helper function that calls the 
constructor then puts it in a channel. The helper function is

@everywhere begin 
  function remoteTypeConstructor(arguments)
     obj = constructMyBigType(arguments)
     chan = Channel{MyBigType}(1)
     put!(chan,obj)
  end
end


Then from the master Julia process I use the following two lines of code to 
define the remote channel, which is a reference to the MyBigType instance 
stored on worker pid. 
sendToWorker(arguments,pid)

R = RemoteChannel(()->remoteTypeConstructor(arguments), pid)

Once I've defined R I can work with it using take!() and put!() just like 
in 0.4. The type constructor function here could possibly be 
computationally intensive and the resulting object could occupy a lot of 
memory so I'd like to have the constructor function run on the remote 
worker. The approach I've just defined seems to work but it's pretty 
awkward and could become tricky/a pain to manage if I have to write one of 
these helper functions for every new type of data I want to compute and 
store using a RemoteChannel. I'm wondering if there's a better way to do 
what I'm trying to do?

Thanks very much, Patrick



Reply via email to