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

Исходное сообщение
"Shared variables in Perl"

Отправлено Raist , 27-Сен-06 23:49 
Вот сижу пишу одну штуковину на перле и возникла тут одна проблема...собственно сабж. Можно ли както реализовать это штатными средствами языка? ситуация какая, есть куча процессов (fork()...) каждый из них содержит список каких то данных (понятно идентичный, получает его в наледство от родителя, но ясно каждый по своей копии), и вот каждый из этих процессов обрабатывает работает с этим  списком, и иногда выходит так что некоторые элементы этого списка необходио удалить..и вот тут возникает проблема - как удалить эти элементы для всех процессов? Ведь каждый из них содержит свою копию списка,  выборка идет рандомно,удаляем в одном, но толку, любой другой может наткнутся на этот элемент опять...теряем время...
Единственно решение которо я сейчас вижу это использование SysV сообщений тоесть если один из процессов находить "плохой" элемент, сообщает об этом всем остальным, и каждый процесс удаляет этот элемент у себя....но опять же, как это не красиво...можно ли зделать ждейсвтительно общую переменную? (а может как то отобразить файл в память, и юзать файл-хендлы?) подскажите..

Содержание

Сообщения в этом обсуждении
"Shared variables in Perl"
Отправлено chip , 29-Сен-06 13:39 
>Вот сижу пишу одну штуковину на перле и возникла тут одна проблема...собственно
>сабж. Можно ли както реализовать это штатными средствами языка? ситуация какая,
>есть куча процессов (fork()...) каждый из них содержит список каких то
>данных (понятно идентичный, получает его в наледство от родителя, но ясно
>каждый по своей копии), и вот каждый из этих процессов обрабатывает
>работает с этим  списком, и иногда выходит так что некоторые
>элементы этого списка необходио удалить..и вот тут возникает проблема - как
>удалить эти элементы для всех процессов? Ведь каждый из них содержит
>свою копию списка,  выборка идет рандомно,удаляем в одном, но толку,
>любой другой может наткнутся на этот элемент опять...теряем время...
>Единственно решение которо я сейчас вижу это использование SysV сообщений тоесть если
>один из процессов находить "плохой" элемент, сообщает об этом всем остальным,
>и каждый процесс удаляет этот элемент у себя....но опять же, как
>это не красиво...можно ли зделать ждейсвтительно общую переменную? (а может как
>то отобразить файл в память, и юзать файл-хендлы?) подскажите..

Shared Memory + соответствующие блокировки



"Shared variables in Perl"
Отправлено Асен Тотин , 30-Сен-06 02:47 
Привет,

В Perl есть полный набор System V IPC (только под UNIX, конечно) - и shared memory, и семафоры, и очереди... с другой стороны, Perl поддерживает multi-threaded приложения где память так или иначе - одна на всех.

WWell,


"Shared variables in Perl"
Отправлено Raist , 01-Окт-06 14:35 
Собсно что мне удалось расковырять:
1.Shared Memory Рализовыватся в модулях Sys::Mmap и более высокоуровнево в модулe IPC::Shareable (кажется так называется) но как я понял ни один из них не входит в стандартную поставку перла, тоесть их надо доствлять.
2. А вот потоки не пробывал ) Просто уже куча всего написано через fork, пока лень преписывать :) Вобще проблему решил, используя отдельный процесс обработчик списка, и сообщение других процессов с ним через пайпы, немного извартно конечно но все же :)