Hi!

I am pleased to announce the (very beta-ish) release of AnyEvent.

This module (which I started to write over a year ago after implementing
it's basic ideas in Net::FCP, but couldn't work on till recently)
implements a _very_ simple and stripped-down Event-like API.

The twist is that it can run on top of Event, Coro::Event, Glib and even Tk
(the latter with a lot of restricftions, but still).

It is mostly meant to be used by module authors who were reluctant to use
an event-based approach because they feared forcing users of their module
into a specific event loop. Often, this resulted in a blocking-only API
(witness all the blocking-only Net::*-modules).

AnyEvent provides very simple IO-watchers:

    my $io_watcher = AnyEvent->io (fh => \*STDIN, poll => ’r’, cb => sub {
       warn "io event <$_[0]>\n";   # will always output <r>
    });

Very simple one-shot-timers:

    my $timer = AnyEvent->timer (after => 1, cb => sub {
       warn "timeout\n";
    });

And "condition variables":

   my $cv = AnyEvent->condvar;
   $cv->wait; # wait till some handler calls ->broadcast
   $cv->broadcast; # wake up wait'ers

The latter are a kind of tie into the main loop, and can be used to implement
blocking behaviour.

An example user is the Net::FCP module. It uses io-watchers for socket
communications and a condvar to signal result availability. It features an
autogenerated blocking API:

   my $data = $fcp->client_get ($url);

Which just calls into the non-blocking API:

   my $transaction = $fcp->txn_client_get ($url);
   # returns very quickly
   my $data = $transaction->result;
   # blocks till data is available

This can be used to parallelize e.g. client_get requests easily:

   my @datas = map $_->result,
                  map $fcp->txn_client_get ($_),
                     @urls;

All without having to specify an event model (or even having to think
about events when using the module): AnyEvent will automatically detect
wether a supported event module is loaded and will use it, and otherwise
will probe for a supported one. So the above "parallelizing" example will
work in a Gtk2, Tk and Event-based program.

Now all we would need is somebody who rewrites LWP into an AnyEvent-based
package...

(Also writing an implementation for other event loops such as Qt should be
very simple: the Event intefrace has 57 lines, while the Glib interface
(longest one) takes only 77 lines).

-- 
                The choice of a
      -----==-     _GNU_
      ----==-- _       generation     Marc Lehmann
      ---==---(_)__  __ ____  __      [EMAIL PROTECTED]
      --==---/ / _ \/ // /\ \/ /      http://schmorp.de/
      -=====/_/_//_/\_,_/ /_/\_\      XX11-RIPE

Reply via email to