![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Верлиока |
|
|||
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 16.9.2005 Репутация: нет Всего: 4 |
господа, объясните плс как этим делом правильно пользоваться. я прочитал пару тем здесь на форуме и рецепт "7.11. Locking a File" из Perl Cookbook о'рейли и мне все еще не понятны несколько моментов.
1. при вызове flock, в случае если файл залочен другим процессом, скрипт будет ждать пока файл разлочится и только потом перейдет к следующей после flock инструкции? или просто сразу вывалится с ошибкой? 2. зачем использовать файл-семафор? почему нельзя просто сначала залочить файл, в который собираемся писать, а потом только его открывать? (файл ведь лочится от ДРУГИХ процессов...) 3. зачем нужен не-блокирующий запрос? (флаг LOCK_NB) о'рейли даёт такой код:
допустим файл залочен на запись другим процессом. мы сразу увидим надпись (1)? а когда и в каком случае мы увидим сообщение (2)? Это сообщение отредактировал(а) Верлиока - 16.9.2005, 15:25 |
|||
|
||||
sharq |
|
||||||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
Верлиока
Будет ждать, пока процесс завершит работу с файлом. если не возможно вызвать flock, то вывалится с ошибкой (такого еще не видел ![]()
не всегда лочение помогает, часто файл-семафор удобен при CGI-программирование.
Если честно, то сам никогда не видел сообщения 2, но поверь, если это написал Том Кристиансен, то это нужно. ![]() ![]() -------------------- [color=gray]There's More Than One Way To Do It[/color] |
||||||
|
|||||||
Верлиока |
|
||||
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 16.9.2005 Репутация: нет Всего: 4 |
так разница только в удобстве или то что я лочу сам файл может вызвать какие-то ошибки? в рецепте ясно сказано что flock блокирует только flock-запросы, и не мешает производить чтение-запись, поэтому всё будет корректно работать только если каждая функция, делающая что-то с файлом, будет предварительно запрашивать на него лок. там же в рецепте есть такое:
- здесь лочится сам файл. не могли бы вы объяснить на примере когда нужно делать семафор? |
||||
|
|||||
sharq |
|
||||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
Верлиока
Разница в том, что тебе не придется ждать, пока файл освободится. Если существует файл-семафор, значит файл используется другим процессом, и следовательно стоит закончить выполнение части кода, связанной с обработкой файла + вывести пользователю соответствующее сообщение. Если ты будешь использовать flock в cgi-скриптах, то если файл занят, скрипт будет ждать пока файл не освободится, тем самым скрипт не закончит свою работу и пользователь будет ждать загрузки страницы. Это не есть гуд. ![]() Читай здесь, это тема обсуждалась.
Конечно! Аналогично с файлом-симафором. Везде нужна синхронизация. ![]() Это сообщение отредактировал(а) sharq - 17.9.2005, 11:40 -------------------- [color=gray]There's More Than One Way To Do It[/color] |
||||
|
|||||
Верлиока |
|
|||
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 16.9.2005 Репутация: нет Всего: 4 |
спасибо :)
только ту тему я уже читал... ладно, я понял, все рекомендуют пользоваться семафором - странно что этого нет в рецептах. мне один спец, у которого я спросил совета, сказал что нужно еще предусматривать ситуацию, когда лок с семафора может вообще не сняться. :)) грит "всякое бывает"... у меня складывается впечатление что программируя на перле ничему нельзя верить. :) |
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Кстати не только на Perl, особенно когда работаешь с файлами, сетью и т.д. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
Верлиока |
|
||||
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 16.9.2005 Репутация: нет Всего: 4 |
вот что мне один хороший человек рассказал:
в связи с этим у меня вопросик - что нужно добавить к коду, данному в этом посте чтобы избежать описанного выше глюка?
так? Это сообщение отредактировал(а) Верлиока - 19.9.2005, 12:41 |
||||
|
|||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Хех, так твой приятель имеет ввиду блокировку потоков, а не файлов. В принципе это может быть и блокировка файлов, но в многопоточной программе. Другими словами программа порождает несколько, дочерних, потоков ( не путай потоки с процессами ), каждый из которых обращается к файлу. Для того что бы избежать подобных нюансов, существует синхронизация. Но для того, что бы Perl корректно работал с потоками, тебе нужно перекомпилировать его ( Perl ), в многопоточный Perl. О том как это делается можно почитать в файле README.threads в каталоге с исходным кодом Perl. Только эта версия Perl будет работать немного медленнее, зато многопоточно.
По возможности компилируй самую последнюю версию Perl. Так же читай документацию к модулю Thread. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |