Django - сделать поток ввода / вывода файлов безопасным - PullRequest
1 голос
/ 28 августа 2010

Я хочу читать и записывать python-source-файлы из файловой системы потокобезопасным способом.

open("n2.py","w").write(my_new_py_class)
from myproject import n2
#do something with n2

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

Ответы [ 2 ]

4 голосов
/ 28 августа 2010

Почему вы заставляете ваше приложение изменять свои собственные файлы?Это не только невероятно зло, метапрограммирование на порядок сложнее понять при отладке.Кроме того, Python кэширует импортируемые им модули, поэтому перезагрузить его не так-то просто.И, наконец, что не менее важно, вам не нужно записывать код в файл, чтобы выполнить его, если вы действительно должны выполнить динамически сгенерированный код.

Чтобы ответить на ваш вопрос о записи файлов в поточно-ориентированном видеобщее соглашение таково:

  • Запись содержимого во временный файл в той же файловой системе, что и целевой файл.
  • Переименование этого временного файла в целевой файл, перезаписывая его впроцесс.

Это работает, потому что переименование является атомарным в системах POSIX, когда выполняется на том же устройстве.Таким образом, в других потоках / процессах либо будет по-прежнему открыт старый файл, который теперь отсоединен от файловой системы и будет удален, как только эти потоки / процессы будут завершены, либо они откроют новый файл со всем его содержимым.Вы избегаете иметь файл, который наполовину записан.

На практике мне нравится создавать временный каталог с модулем tempfile в python, и записывать туда файл, затем перемещать его и удалять каталог - этоспособ создания файла с использованием umask по умолчанию.

И последнее, но не менее важное: переименование не является на самом деле атомарным в Windows, по крайней мере с настройками по умолчанию, поскольку оно не позволит вам перезаписать старый файл - вам нужносделать два переименования, и это вводит возможность состояния гонки.Я не знаю хорошего решения для Windows.

0 голосов
/ 28 августа 2010

У меня была похожая проблема.Проверьте ответ Эрика Карульфа в этом вопросе:

Django и динамически генерируемые изображения

Мы также предоставили некоторый код:)

...