Class: ZMQ::Context

Inherits:
Object
  • Object
show all
Includes:
Util
Defined in:
lib/ffi-rzmq/context.rb

Overview

Recommended to use the default for io_threads since most programs will not saturate I/O.

The rule of thumb is to make io_threads equal to the number gigabits per second that the application will produce.

The io_threads number specifies the size of the thread pool allocated by 0mq for processing incoming/outgoing messages.

Returns a context object when allocation succeeds. It’s necessary for passing to the #Socket constructor when allocating new sockets. All sockets live within a context.

Also, Sockets should only be accessed from the thread where they were first created. Do not pass sockets between threads; pass in the context and allocate a new socket per thread. If you must use threads, then make sure to execute a full memory barrier (e.g. mutex) as you pass a socket from one thread to the next.

To connect sockets between contexts, use inproc or ipc transport and set up a 0mq socket between them. This is also the recommended technique for allowing sockets to communicate between threads.

context = ZMQ::Context.create
if context
  socket = context.socket(ZMQ::REQ)
  if socket
    ...
  else
    STDERR.puts "Socket allocation failed"
  end
else
  STDERR.puts "Context allocation failed"
end

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Util

bind_to_random_tcp_port, errno, error_string, nonblocking_flag, resultcode_ok?, version

Constructor Details

#initialize(io_threads = 1) ⇒ Context

Use the factory method Context#create to make contexts.



54
55
56
57
58
59
60
61
# File 'lib/ffi-rzmq/context.rb', line 54

def initialize io_threads = 1
  @sockets = []
  @context = LibZMQ.zmq_init io_threads
  @pointer = @context
  error_check 'zmq_init', (@context.nil? || @context.null?) ? -1 : 0

  define_finalizer
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



46
47
48
# File 'lib/ffi-rzmq/context.rb', line 46

def context
  @context
end

#pointerObject (readonly)

Returns the value of attribute pointer.



46
47
48
# File 'lib/ffi-rzmq/context.rb', line 46

def pointer
  @pointer
end

Class Method Details

.create(io_threads = 1) ⇒ Object



48
49
50
# File 'lib/ffi-rzmq/context.rb', line 48

def self.create io_threads = 1
  new(io_threads) rescue nil
end

Instance Method Details

#socket(type) ⇒ Object

Short-cut to allocate a socket for a specific context.

Takes several type values:

#ZMQ::REQ
#ZMQ::REP
#ZMQ::PUB
#ZMQ::SUB
#ZMQ::PAIR
#ZMQ::PULL
#ZMQ::PUSH
#ZMQ::DEALER
#ZMQ::ROUTER

Returns a #ZMQ::Socket when the allocation succeeds, nil if it fails.



98
99
100
101
102
103
104
105
106
107
# File 'lib/ffi-rzmq/context.rb', line 98

def socket type
  sock = nil
  begin
    sock = Socket.new @context, type
  rescue ContextError => e
    sock = nil
  end
  
  sock
end

#terminateObject

Call to release the context and any remaining data associated with past sockets. This will close any sockets that remain open; further calls to those sockets will return -1 to indicate the operation failed.

Returns 0 for success, -1 for failure.



70
71
72
73
74
75
76
77
78
79
80
# File 'lib/ffi-rzmq/context.rb', line 70

def terminate
  unless @context.nil? || @context.null?
    remove_finalizer
    rc = LibZMQ.zmq_term @context
    @context = nil
    @sockets = nil
    rc
  else
    0
  end
end