Кэширование файлов службы Python Условие гонки Apache - PullRequest
1 голос
/ 20 декабря 2009

Я пишу сервис python (pyamf), через который пользователь может получить доступ к изображениям. Все изображения хранятся на центральном сервере. Сервисы python будут работать на спутниковых машинах, которые имеют сетевой доступ к серверу. Сервис должен работать следующим образом:

  1. проверить локально, чтобы увидеть, существует ли файл, если так, используйте его.
  2. локально проверить, передается ли файл с сервера (файл.part существует, а размер изменяется). Если это так, дождитесь окончания загрузки, затем используйте файл.
  3. если файл не существует и файл не загружается, загрузите файл через urlretrieve.

Проблема связана с несколькими потоками Apache. Потоки одновременно проверяют наличие файла, и поэтому все считают, что файл необходимо загрузить. Само собой разумеется, это не хорошо.

Как правильно справиться с этим состоянием гонки?

Спасибо!

1 Ответ

1 голос
/ 21 декабря 2009

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

Эту проблему иногда называют проблемой «собачьей кучки», и она является одной из проблем, решаемых библиотекой кэширования Beaker (http://beaker.groovie.org).). Она предоставляет систему, с помощью которой вы можете создать вызываемый объект, который «создает» новый кэшированный значение, в данном случае URL, соответствующий некоторому изображению, которое выбирается, если значение еще не существует. Блокировка используется таким образом, что параллельные потоки или процессы ожидают, пока один процесс, выбранный в качестве «создателя», завершит свою работу. Beaker будет использовать файлы блокировки, если они настроены на многопроцессорные системы, подобные UNIX, или мьютексы, если в системе Windows.

Я оригинальный автор кишок Бикера вместе с Беном Бангертом, который упаковал его для использования с Pylons.

...