Кэширование файлов службы Python Условие гонки Apache

1

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

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

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

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

Спасибо!

Теги:
race-condition
service

1 ответ

1

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню