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
