http://www.perlmonks.org?node_id=1027134


in reply to Callback multiplexer

Hi there,

Not 100% sure on everything you're looking for or how you're expecting things to work. But maybe this little example will at least get you going:

#!perl -w use strict; use warnings; use feature 'say'; use AnyEvent::Util; my $spawn_complete = AnyEvent->condvar; sub spawn { my $name = shift; my $sleep = rand 10; $spawn_complete->begin; fork_call { say "$name($$) about to sleep for $sleep"; sleep $sleep; } sub { say "$name Awake!"; $spawn_complete->end; }; } # Run 5 long processes in the background spawn $_ for qw(abc def ghi jkl mno); # Wait for all background tasks to finish $spawn_complete->recv; say "All done";

Replies are listed 'Best First'.
Re^2: Callback multiplexer
by Dallaylaen (Chaplain) on Apr 05, 2013 at 15:28 UTC

    Yes, using begin/end is a possible solution. For instance, Twiggy is using logic similar to this.

    However, I would like to be protected from a callback firing twice. I would also like to untie the application logic from condvar handling - it's much easier to develop modules when they just rely on a running event loop.

      There are many possible answers and solutions to address your concerns. And I am new to AnyEvent myself. So could you explain in the example above how the callback could fire twice?

      Notice too that in the example, all of the condvar handling is confined to the parent process. The callback only gets called when the child finishes and returns. All of the application logic exist in child processes and has no knowledge of condvars. This alows you to run code from say CPAN, that was written with no intention of being executed this way. And to my untrained eye, no danger of a callback double fire.