URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8435
[ Назад ]

Исходное сообщение
"fork, pipe, передача сложных данных между процессами"

Отправлено jr , 16-Сен-09 15:10 
Хотелось бы понять, как более рациональней, чем представлено ниже в примере, передать сложную структуру данных между процессами perl?
В примере я кодировал структуру perl-данных при помощи модуля Storable и далее преобразовывал все это дело посредством join( '_', unpack( "C*", ) ) в строку, состоящую из кодов ASCII, разделенных символом "_". Все это дело, конечно, работает, но получается, что в трубе по факту гоняется больше чем нужно данных (в 3-4 раза).


#!/usr/bin/perl

use strict;
use warnings;

use Storable;
use IO::Pipe;
use IO::Handle;
use Data::Dumper;

# создаем трубу
my $pipe = IO::Pipe->new();

# делаем fork
my $pid = fork();

# дочка
if( $pid == 0 ) {
   # тут мы пишем в трубу
   $pipe->writer();
   $pipe->autoflush( 1 );

   foreach( 1..10 ) {
      # создаем ссылку на хэш
      my $data = { pid => $$, data => $_ };

      # пересылаем в трубу закодированный в строку хэш
      print $pipe join( '_', unpack( "C*", Storable::freeze( $data ) ) ) . "\n";

      # sleep на 0.3 секунды
      select undef, undef, undef, 0.3;
   }
}

# родитель
else {
   unless( defined $pid ) {
      die 'Cannot fork';
   }

   # тут мы читаем из трубы
   $pipe->reader();

   while( <$pipe> ) {
      # преобразуем строку в данные
      my $data = Storable::thaw( pack( "C*", split( '_', $_ ) ) );

      # выводим то, что пришло от дочки
      print Dumper $data;
   }
}



Содержание

Сообщения в этом обсуждении
"fork, pipe, передача сложных данных между процессами"
Отправлено ACCA , 18-Сен-09 04:18 
#!/usr/bin/perl
use strict;
use warnings;

use Storable qw(store_fd fd_retrieve);
use IO::Pipe;
use IO::Handle;
use Data::Dumper;

# создаем трубу
my $pipe = IO::Pipe->new();

# делаем fork
my $pid = fork();

# дочка
if( $pid == 0 ) {
   # тут мы пишем в трубу
   $pipe->writer();
   $pipe->autoflush( 1 );

   foreach( 1..10 ) {
      # создаем ссылку на хэш
      my $data = { pid => $$, data => $_ };

      # пересылаем в трубу закодированный в строку хэш
      store_fd $data, $pipe;

      # sleep на 0.3 секунды
      select undef, undef, undef, 0.3;
   }
}

# родитель
else {
   unless( defined $pid ) {
      die 'Cannot fork';
   }

   # тут мы читаем из трубы
   $pipe->reader();

   until ( eof $pipe ) {
      my $data = fd_retrieve($pipe);

      # выводим то, что пришло от дочки
      print Dumper $data;
   }
}


"fork, pipe, передача сложных данных между процессами"
Отправлено jr , 18-Сен-09 11:19 
>use Storable qw(store_fd fd_retrieve);
>      store_fd $data, $pipe;
>   until ( eof $pipe ) {
>      my $data = fd_retrieve($pipe);

Спасибо! Сам почему-то не увидел в доке этого...