The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
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, 04:18 , 18-Сен-09 (1)
    #!/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;
       }
    }




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру