Class: Async::Container::Channel

Inherits:
Object
  • Object
show all
Defined in:
lib/async/container/channel.rb

Overview

Provides a basic multi-thread/multi-process uni-directional communication channel.

Direct Known Subclasses

Forked::Child, Threaded::Child

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(timeout: 1.0) ⇒ Channel

Initialize the channel using a pipe.



13
14
15
16
# File 'lib/async/container/channel.rb', line 13

def initialize(timeout: 1.0)
  @in, @out = ::IO.pipe
  @in.timeout = timeout
end

Instance Attribute Details

#inObject

The input end of the pipe.



20
21
22
# File 'lib/async/container/channel.rb', line 20

def in
  @in
end

#outObject

The output end of the pipe.



24
25
26
# File 'lib/async/container/channel.rb', line 24

def out
  @out
end

Instance Method Details

#closeObject

Close both ends of the pipe.



37
38
39
40
# File 'lib/async/container/channel.rb', line 37

def close
  close_read
  close_write
end

#close_readObject

Close the input end of the pipe.



27
28
29
# File 'lib/async/container/channel.rb', line 27

def close_read
  @in.close
end

#close_writeObject

Close the output end of the pipe.



32
33
34
# File 'lib/async/container/channel.rb', line 32

def close_write
  @out.close
end

#receiveObject

Receive an object from the pipe. Internally, prefers to receive newline formatted JSON, otherwise returns a hash table with a single key ‘:line` which contains the line of data that could not be parsed as JSON.



45
46
47
48
49
50
51
52
# File 'lib/async/container/channel.rb', line 45

def receive
  if data = @in.gets
    return JSON.parse(data, symbolize_names: true)
  end
rescue => error
  Console.error(self, "Error during channel receive!", error)
  return nil
end