El módulo Coro::Signal provee objetos señales. Una corutina puede esperar por la ocurrencia de una señal en cuyo caso despertará a una de las corutinas que esperan o bien puede hacerse un broadcast en cuyo caso se despertarán todas las corutinas que están bloquedas a la espera de esa señal. Los envíos ( send ) no parece que sean bloqueantes pero si que lo son las esperas ( wait ).
pp2@nereida:~/src/perl/coro$ cat -n consumerproducer1.pl 1 #!/usr/bin/perl 2 use strict; 3 use warnings; 4 5 # the classical producer/consumer example. 6 # one process produces items, send s a signal. 7 # another process waits for that signal and 8 # consumed the item. 9 10 use Coro; 11 use Coro::Signal; 12 13 my $produced = new Coro::Signal; 14 my $consumed = new Coro::Signal; 15 my $finished = new Coro::Signal; 16 17 my $n = shift || 5; 18 my @resource; 19 my $sum = 0; 20 21 async { 22 for (1..$n) { 23 push @resource, $_; 24 print "produced $_\n"; 25 $produced->send; 26 $consumed->wait; 27 } 28 print "work done\n"; 29 $finished->send; 30 }; 31 32 async { 33 while () { 34 $produced->wait; 35 print "consuming resources\n"; 36 $sum += $_ while $_ = shift @resource; 37 $consumed->send; 38 } 39 }; 40 41 $finished->wait; 42 43 print "job finished: sum = $sum\n";
pp2@nereida:~/src/perl/coro$ consumerproducer1.pl 8 produced 1 consuming resources produced 2 produced 3 consuming resources consuming resources produced 4 produced 5 consuming resources consuming resources produced 6 produced 7 consuming resources consuming resources produced 8 work done consuming resources consuming resources job finished: sum = 36
Casiano Rodríguez León