Señales: Productor Consumidor

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
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19