Модераторы: ginnie, korob2001, JackYF
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Совместное использование объектов в процессах, Межпроцессорное взаимодействие 
V
    Опции темы
DProf
Дата 2.11.2012, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 28.9.2012

Репутация: нет
Всего: 1



Возможно ли в PERLе такое межпроцессорное взаимодействие: возвращение объекта из дочернего процесса? Задача такая - параллельно крутятся процессы (полученные fork-ом) и каждый инициализирует и заполняет  данными объект(по объекту на процесс), который должен потом вернуться в родительский процесс для дальнейшей работы в родителе с объектами от детей. Совместное использование переменных в разных процессах очень простое - IPC::Shareable например. А вот сложные структуры так отработать не получается. Для демонстрации, например, надо вернуть объект Imager->new(), но вот тогда IPC::Shareable уже не работает:
Код

use warnings;use strict;use 5.10.1;
use IPC::Shareable;
use Imager;

my ($common, $bufer);
$common = tie $bufer, 'IPC::Shareable',  undef, {destroy => 1};

my $child = fork();

if ($child){
    print STDERR 'begin parent';
    waitpid($child,0);    
    print "--PARENT:\n\t\$common = $common_var\n\t\$bufer = $bufer\n";    
    print STDERR "parent exit\n";
}else{        
    print STDERR "begin child\n";
    $bufer = 'foo';
    #$bufer = Imager->new();# if no coment, this string write warn:
                            # Could not create semaphore set: No space left on device 
    print "--CHILD:\n\t\$common = $common_var\n\t\$bufer = $bufer\n";
    print STDERR "child exit\n";
}

exit;


Причем возвращать нужно именно объект, а не сами данные - просто передать их через pipe и потом заново в родителе инициализировать объект по этим данным можно, но это очень неэффективно по времени - не годится.

Как быть с совместным использованием объектов? В-принципе объекты для каждого процесса может инициализировать родитель и передавать детям ссылку, а в дочерних процессах эти объекты заполняются, но ведь даже так не работает:
Код

$common = tie $bufer, 'IPC::Shareable',  undef, {destroy => 1};
$bufer = Graphics::Magick->new();# Could not create semaphore set: No space left on device 


Perldoc и Camelbook не помогли... Я не очень хорошо разбираюсь в особенностях межпроцессорного взаимодействия - подскажите, возможно ли вообще то, что я хочу?
Спасибо, жду ответ.

Это сообщение отредактировал(а) DProf - 2.11.2012, 15:57
PM MAIL   Вверх
Pfailed
Дата 2.11.2012, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39





--------------------
PM MAIL   Вверх
DurRandir
Дата 2.11.2012, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: нет
Всего: 17



Если коротко, то состояние объекта Imager - это не только перловые данные, но и состояние С-шной библиотеки. Его вы передать не сможете. Меняйте архитектуру - передавать между процессами объекты это странное желание, процессы для того и делаются, чтобы изолированно выполнить задачу от начала и до конца.
PM   Вверх
DProf
Дата 6.11.2012, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 28.9.2012

Репутация: нет
Всего: 1



Спасибо за оперативный ответ.
DurRandir, согласен с Вами, сейчас так все и работает, процесс выполняет свою задачу, возвращает данные (картинку) через pipe и умирает. Беда лишь в том, что сначала в дочернем идет вызов Write (не самый быстрый), потом в родителе данные читаются (снова потеря времени) и снова инициализируется тот же объект, с которым идет дальнейшая работа (объекты от нескольких процессов соединяются и тд). Вот и хотелось не терять время сначала на печать картинки, а потом на инициализацию объекта по этой же картинке. Так что желание не совсем странное )

Это сообщение отредактировал(а) DProf - 6.11.2012, 12:30
PM MAIL   Вверх
DProf
Дата 27.12.2012, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 28.9.2012

Репутация: нет
Всего: 1



Кстати как вариант можно было использовать потоки (threads). Но там тоже проблемы есть.
PM MAIL   Вверх
Google
  Дата 23.5.2019, 16:12 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1327 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.