RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : Установка атрибутов файлов из Rexx


Список сообщений | Написать новое | Ответить на сообщение | Домой Поиск:
Предыдущее сообщение | Следующее сообщение
From : Improver
To : Aleksey Tarasow
Subj : Установка атрибутов файлов из Rexx

> > Предлагаю сбрасывать полные имена залоченых файлов в очередь, например в RXQUEUE, а при завершении процесса удалять их оттуда... Или наоборот, сразу сбросить в очередь полный список всех файлов и каждый процесс будет удалять оттуда строки по мере их обработки. В любом случае, отсутствие дополнительных дисковых операций должно, по идее, дать прирост в скорости обработки.
>
> Процессы которые работают с файлами запускаются хаотично в любом количестве и не чего не знают друг о друге. Количество файлов за раннее не известно, но с течением времени будет только расти. Лочится только текущий файл, то есть с остальными файлами другие процессы могут делать что угодно. Выходит что каждый файл нужно искать отдельно в актуальном списке лоченных файлов.
> Можно ли в очередь кидать сообщения (разными процессами), многократно их читать (каждым процессом, перед началом работы с каждым файлом), и удалять выборочно (например по индексу и т.п.)?
>
Удалять выборочно не получится, цитата из мануала по REXX:
---
В процедурах работа с очередями REXX осуществляется с помощью следующих инструкций:
PUSH Помещает строку в начало очереди (LIFO).
QUEUE Добавляет строку в конец очереди (FIFO).
PULL Считывает строку из начала очереди. Если очередь пуста, то строка считывается с консоли (STDIN:).
Чтобы получить информацию о количестве элементов, оставшихся в очереди, используйте функцию QUEUED.
---

Значит хранение списка лоченых файлов потребует, как минимум, создания некоторой процедуры для считывания всей очереди, удаления из ней нужной строки и сброса оставшихся данных назад... Тогда по второму варианту будет проще сделать, алгоритм примерно такой:

1. *Один* процесс создаёт именованную очередь и отвечает за её наполнение, т.е. постоянно с некоторой периодичностью ищет новые файлы и добавляет их в конец очереди (QUEUE).

2. Все остальные процессы просто читают с удалением строку с именем файла из начала очереди (PULL) и обрабатывают этот файл нужным образом. Если очередь пуста, то процесс ждёт появления строки, или завершают свою работу -- это как решишь сам.

Но тут есть такой момент: в документации по REXX также сказано, что синхронизация запросов (когда два процесса, имеющие доступ к одной и той же очереди, получают данные из этой очереди в порядке регистрации их запросов) возлагается на пользователя и не обеспечивается подсистемой, на время чтения все процессы для синхронизации должны выставлять какой-нибудь флаг, для совместимости на разных системах можно, например, изменять значение системной переменной...

Mon 12 Jan 2015 00:52 Mozilla/5.0 (OS/2; Warp 4.5; rv:17.0) Gecko/20100101 Firefox




Programmed by Dmitri Maximovich, Dmitry I. Platonoff, Eugen Kuleshov.
25.09.99 (c) 1999, RU/2. All rights reserved.
Rewritten by Dmitry Ban. All rights ignored.