The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"fork, pipe, передача сложных данных между процессами"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"fork, pipe, передача сложных данных между процессами"  +/
Сообщение от jr email(ok) on 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;
   }
}


Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "fork, pipe, передача сложных данных между процессами"  +/
Сообщение от ACCA (ok) on 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;
   }
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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