Возможно ли в 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 не помогли... Я не очень хорошо разбираюсь в особенностях межпроцессорного взаимодействия - подскажите, возможно ли вообще то, что я хочу? Спасибо, жду ответ. |