2013-04-10 2 views
0

У меня есть поток, записывающий в файл (writeThread) периодически, а другой (readThread), который читает из файла асинхронно. Может ли readThread получить доступ к файлу с помощью другого дескриптора и не испортить что-нибудь?Python общий доступ к файлам между потоками

Если нет, у python есть общий замок, который может использоваться writeThread, но не блокирует readThread? Я бы не предпочел бы простую не разделяемую блокировку, потому что доступ к файлам занимает порядка миллисекунды, а период записи writeThread имеет тот же порядок (период зависит от некоторых внешних параметров). Таким образом, может возникнуть ситуация, когда writeThread может освободить блокировку, и она немедленно восстановит ее и, таким образом, вызовет голод.

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

Есть ли другие альтернативы или это плохой дизайн?

Благодаря

ответ

0

Да, вы можете открыть файл несколько раз и получить независимый доступ к нему. Каждый файловый объект будет иметь свои собственные буферы и положение, так что, например, поиск на одном не испортит другой. Он работает почти так же, как и множественный доступ к программе, и вы должны быть осторожны при чтении и записи той же области файла. Например, запись, добавляемая в конец файла, не будет видна читателю до тех пор, пока объект записи не начнет сбрасываться. Прерывания существующих данных не будут рассматриваться читателем до тех пор, пока читатель и писатель не начнут скрываться. Записи не будут атомарными, поэтому, если вы пишете записи, читатель может видеть частичные записи. асинхронные события выбора или опроса в читателе могут быть фанки ... не уверены в этом.

Альтернатива - mmap, но я не использовал ее достаточно, чтобы узнать, что произошло.

Смежные вопросы