[ANN] IO-Reactor 0.04

M

Michael Granger

Hi fellow Rubyists,

I'd like to announce version 0.04 of the 'IO-Reactor' module, which
used to be called 'Ruby-Poll', and used to wrap the poll(2) system
call. It no longer does so, for two reasons:

* poll() is not very portable
* poll() doesn't work with Ruby's threads (ie., a blocking call to
poll() blocks all threads).

Since I find that the API simplifies some IO tasks, and is (I think) a
more Ruby-ish IO idiom, I've rewritten the backend using IO::select,
while keeping (mostly) the same interface. The last version of the
'Ruby-Poll' module will continue to be available for the foreseeable
future, but will no longer be actively maintained.

So, what's IO-Reactor?

It's an implementation of an asynchronous multiplexed IO Reactor class
which is based on the Reactor design pattern found in _Pattern-Oriented
Software Architecture, Volume 2: Patterns for Concurrent and Networked
Objects_. It allows a single thread to demultiplex and dispatch events
from one or more IO objects to the appropriate handler. In other words,
you can take a collection of IO objects, register them all with the
reactor with handlers for read, write, and error events, and then drive
IO in your application all with one call.

A simple example:

require 'io/reactor'
require 'socket'

reactorobj = IO::Reactor::new

# Open a listening socket on port 1138 and register it with the
# reactor. When a :read event occurs on it, it means an incoming
# connection has been established
sock = TCPServer::new('localhost', 1138)
reactorobj.register( sock, :read ) {|sock,event|
case event

# Accept the incoming connection, registering it also with
# the reactor; events on client sockets are handled by the
# #clientHandler method (not shown).
when :read
clsock = sock.accept
reactorobj.register( clsock, :read, :write,
&method:)clientHandler) )

# Errors on the main listening socket cause the whole
# reactor to be shut down
when :error
reactorobj.clear
$stderr.puts "Server error: Shutting down"

else
$stderr.puts "Unhandled event: #{event}"
end
}

# Drive the reactor until it's empty with a single thread
Thread::new { reactorobj.poll until reactorobj.empty? }

The module can be downloaded from its project page at:

http://www.deveiate.org/code/IO-Reactor.shtml

The API documentation can be viewed at:

http://www.deveiate.org/code/IO-Reactor/

Comments, bug reports, and feedback are welcomed.

Thanks for your time,
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top