Colas de Estructuras Anidadas

El módulo Storable

El módulo Storable proporciona dos rutinas: Storable::freeze y Storable::thaw que codifican y decodifican una estructura de datos arbitraria a un formato binario. Obsérvese el siguiente ejemplo:

lhp@nereida:~$ perl -de 0
main::(-e:1):   0
  DB<1> use Storable qw(freeze thaw)
  DB<2> $x = { a=>[1..5], b=>{t=>4.5, r=>'hola'} }
  DB<3> $e = freeze($x)
  DB<4> x $e
0  "\cD\cG\cD1234\cD\cD\cD\cH\cC\cB\c@\c@\c@\cD\cB\cE\c@\c@\c@\cH\cH\cH\cH\cH\cA\
c@\c@\c@a\cD\cC\cB\c@\c@\c@\cJ\cDhola\cA\c@\c@\c@r\cG\c@\c@\c@\c@\c@\c@\cR\@\cA\c@\
c@\c@t\cA\c@\c@\c@b"
  DB<5> $a = thaw($e)
  DB<6> x $a
0  HASH(0x843f6d8)
   'a' => ARRAY(0x850a300)
      0  1
      1  2
      2  3
      3  4
      4  5
   'b' => HASH(0x843f588)
      'r' => 'hola'
      't' => 4.5

El Módulo Thread::Queue::Any

Los objetos cola proveídos por Thread::Queue::Any son listas thread-safe que heredan de Thread::Queue : cualquier thread puede añadir o extraer elementos a/de la cabecera sin peligro de que se produzcan race-conditions.

La Clase Thread::Queue::Any

La implementación de la clase no lleva - incluyendo comentarios y documentación - mas de 58 líneas:

lhp@nereida:~$ perl -MThread::Queue::Any -e 'print map {$INC{$_}."\n" if /Queue/ } keys %INC'
/usr/share/perl/5.8/Thread/Queue.pm
/usr/local/share/perl/5.8.4/Thread/Queue/Any.pm
lhp@nereida:~$ cat -n /usr/local/share/perl/5.8.4/Thread/Queue/Any.pm | head -58
 1  package Thread::Queue::Any;
 2
 3  # Make sure we inherit from Thread::Queue
 4  # Make sure we have version info for this module
 5  # Make sure we do everything by the book from now on
 6
 7  @ISA = qw(Thread::Queue);
 8  $VERSION = '0.07';
 9  use strict;
10
11  # Make sure we have Storable
12  # Make sure we have queues
13
14  use Storable ();      # no need to pollute namespace
15  use Thread::Queue (); # no need to pollute namespace
16
17  # Allow for synonym for dequeue_dontwait
18
19  *dequeue_nb = \&dequeue_dontwait;
20
21  # Satisfy -require-
22
23  1;
24
25  #---------------------------------------------------------------------------
26  #  IN: 1 instantiated object
27  #      2..N parameters to be passed as a set onto the queue
28
29  sub enqueue {
30      shift->SUPER::enqueue( Storable::freeze( \@_ ) );
31  }
32
33  #---------------------------------------------------------------------------
34  #  IN: 1 instantiated object
35  # OUT: 1..N parameters returned from a set on the queue
36
37  sub dequeue {
38      @{Storable::thaw( shift->SUPER::dequeue )};
39  }
40
41  #---------------------------------------------------------------------------
42  #  IN: 1 instantiated object
43  # OUT: 1..N parameters returned from a set on the queue
44
45  sub dequeue_dontwait {
46      return unless my $ref = shift->SUPER::dequeue_nb;
47      @{Storable::thaw( $ref )};
48  }
49
50  #---------------------------------------------------------------------------
51  #  IN: 1 instantiated object
52  # OUT: 1..N parameters returned from a set on the queue
53
54  sub dequeue_keep {
55  #    return unless my $ref = shift->SUPER::dequeue_keep; # doesn't exist yet
56      return unless my $ref = shift->[0];                 # temporary
57      @{Storable::thaw( $ref )};
58  }



Subsecciones
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