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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> корректное использование flock, вроде всё просто. но есть нюансы :) 
:(
    Опции темы
Верлиока
Дата 16.9.2005, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



господа, объясните плс как этим делом правильно пользоваться. я прочитал пару тем здесь на форуме и рецепт "7.11. Locking a File" из Perl Cookbook о'рейли и мне все еще не понятны несколько моментов.

1. при вызове flock, в случае если файл залочен другим процессом, скрипт будет ждать пока файл разлочится и только потом перейдет к следующей после flock инструкции? или просто сразу вывалится с ошибкой?

2. зачем использовать файл-семафор? почему нельзя просто сначала залочить файл, в который собираемся писать, а потом только его открывать? (файл ведь лочится от ДРУГИХ процессов...)

3. зачем нужен не-блокирующий запрос? (флаг LOCK_NB) о'рейли даёт такой код:
Код
unless (flock(FH, LOCK_EX|LOCK_NB)) {
    warn "(1) can't immediately write-lock the file ($!), blocking ...";
    unless (flock(FH, LOCK_EX)) {
        die "(2) can't get write-lock on numfile: $!";
    }
}

допустим файл залочен на запись другим процессом. мы сразу увидим надпись (1)? а когда и в каком случае мы увидим сообщение (2)?

Это сообщение отредактировал(а) Верлиока - 16.9.2005, 15:25
PM WWW   Вверх
sharq
Дата 16.9.2005, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



Верлиока
Цитата
1. при вызове flock, в случае если файл залочен другим процессом, скрипт будет ждать пока файл разлочится и только потом перейдет к следующей после flock инструкции? или просто сразу вывалится с ошибкой?

Будет ждать, пока процесс завершит работу с файлом.
если не возможно вызвать flock, то вывалится с ошибкой (такого еще не видел smile )


Цитата
2. зачем использовать файл-семафор? почему нельзя просто сначала залочить файл, в который собираемся писать, а потом только его открывать? (файл ведь лочится от ДРУГИХ процессов...)

не всегда лочение помогает, часто файл-семафор удобен при CGI-программирование.

Цитата

3. зачем нужен не-блокирующий запрос? (флаг LOCK_NB) о'рейли даёт такой код:

Если честно, то сам никогда не видел сообщения 2, но поверь, если это написал Том Кристиансен, то это нужно. smile

smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Верлиока
Дата 17.9.2005, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
не всегда лочение помогает, часто файл-семафор удобен при CGI-программирование.

так разница только в удобстве или то что я лочу сам файл может вызвать какие-то ошибки?

в рецепте ясно сказано что flock блокирует только flock-запросы, и не мешает производить чтение-запись, поэтому всё будет корректно работать только если каждая функция, делающая что-то с файлом, будет предварительно запрашивать на него лок.

там же в рецепте есть такое:
Код

# Here's how you increment a number in a file, using flock:

use Fcntl qw(:DEFAULT :flock);

sysopen(FH, "numfile", O_RDWR|O_CREAT)
                                    or die "can't open numfile: $!";
flock(FH, LOCK_EX)                  or die "can't write-lock numfile: $!";
# Now we have acquired the lock, it's safe for I/O
$num = <FH> || 0;                   # DO NOT USE "or" THERE!!
seek(FH, 0, 0)                      or die "can't rewind numfile : $!";
truncate(FH, 0)                     or die "can't truncate numfile: $!";
print FH $num+1, "\n"               or die "can't write numfile: $!";
close(FH)                           or die "can't close numfile: $!";

- здесь лочится сам файл.


не могли бы вы объяснить на примере когда нужно делать семафор?
PM WWW   Вверх
sharq
Дата 17.9.2005, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



Верлиока
Цитата
так разница только в удобстве или то что я лочу сам файл может вызвать какие-то ошибки?

Разница в том, что тебе не придется ждать, пока файл освободится.
Если существует файл-семафор, значит файл используется другим процессом, и следовательно стоит закончить выполнение части кода, связанной с обработкой файла + вывести пользователю соответствующее сообщение.
Если ты будешь использовать flock в cgi-скриптах, то если файл занят, скрипт будет ждать пока файл не освободится, тем самым скрипт не закончит свою работу и пользователь будет ждать загрузки страницы. Это не есть гуд. smile

Читай здесь, это тема обсуждалась.

Цитата
всё будет корректно работать только если каждая функция, делающая что-то с файлом, будет предварительно запрашивать на него лок.

Конечно! Аналогично с файлом-симафором. Везде нужна синхронизация.

smile

Это сообщение отредактировал(а) sharq - 17.9.2005, 11:40


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Верлиока
Дата 17.9.2005, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо :)

только ту тему я уже читал...
ладно, я понял, все рекомендуют пользоваться семафором - странно что этого нет в рецептах. мне один спец, у которого я спросил совета, сказал что нужно еще предусматривать ситуацию, когда лок с семафора может вообще не сняться. :)) грит "всякое бывает"... у меня складывается впечатление что программируя на перле ничему нельзя верить. :)
PM WWW   Вверх
korob2001
Дата 18.9.2005, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Цитата

у меня складывается впечатление что программируя на перле ничему нельзя верить. smile

Кстати не только на Perl, особенно когда работаешь с файлами, сетью и т.д.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Верлиока
Дата 19.9.2005, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вот что мне один хороший человек рассказал:
Цитата
16.09.2005 21:25:00, LOE
поскольку операция открытия и проверки - не атомарная, то возможна ситуация, когда 2 процесса одновременно обратятся к файлу и обнаружив блокировку будут бесконечно долго ждать, пока другой процесс его не освободит,
и другой процесс - в свою очередь будет ждать.

16.09.2005 21:26:00, LOE
это называется "гонка"

16.09.2005 21:26:00, LOE
поэтому полезно ставить на такую операцию таймер

16.09.2005 21:26:00, LOE
или проверять блокировку в нестопорящемся режиме
и проверять например в цикле

16.09.2005 21:26:00, LOE
и после N проверок - выходить с руганью

16.09.2005 21:50:00, LOE
LOCK_NB - как раз делает неблокирующий блок
чтобы не было вечного "подвисания" в ожидании освобождения файла


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

Цитата
в цикле (до тех пор пока файл не залочится, или флок не вернет ошибку):
     1. проверяем лок семафора не-блокирующим запросом.
     2. если семафор не залочен - отсылаем блокирующий запрос.
     3. если прошло уже N проверок, и семафор не залочился, говорим юзеру сит бэк энд релакс.

так?

Это сообщение отредактировал(а) Верлиока - 19.9.2005, 12:41
PM WWW   Вверх
korob2001
Дата 20.9.2005, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Хех, так твой приятель имеет ввиду блокировку потоков, а не файлов. В принципе это может быть и блокировка файлов, но в многопоточной программе. Другими словами программа порождает несколько, дочерних, потоков ( не путай потоки с процессами ), каждый из которых обращается к файлу. Для того что бы избежать подобных нюансов, существует синхронизация. Но для того, что бы Perl корректно работал с потоками, тебе нужно перекомпилировать его ( Perl ), в многопоточный Perl. О том как это делается можно почитать в файле README.threads в каталоге с исходным кодом Perl. Только эта версия Perl будет работать немного медленнее, зато многопоточно.
По возможности компилируй самую последнюю версию Perl. Так же читай документацию к модулю Thread.


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


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

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


 




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


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

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