2017-01-30 15 views
0

Мне просто интересно узнать о специфике файлового блока модуля python и его поведении в нескольких обстоятельствах.Поведение модуля файлового блокировки Python с помощью `with:` statement

Во-первых, как точно состоит оператор with:, обрабатываемый потоками. Если несколько потоков вызывают with:, то он заблокирован по потоку по потоку? Возможно ли, что два потока могут одновременно захватить замок?

Во-вторых, когда я использую with:, мне нужно очистить замок после его использования? Автоматически очищается ли замок после завершения инструкции with:?

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

channel_file = open(os.path.join('channels', username), 'w+') 
with filelock.FileLock(os.path.join('channels', username)): 
    channel_file.write(json.dumps({'rate': reobj.group(1),'time': reobj.group(2)})) 

Если бы была возможность, что другой поток может прочитать файл с того времени, он был создан, будет ли эта защита против этого?

Это также поднимает четвертую точку. Имеет ли доступ блокировки чтения блокировки при использовании with:?

ответ

0
  1. FileLock поддерживает блокировку счетчика, который является общим для всех потоков в процессе, и защищен за нити-накрест замка. Каждый вызов acquire() увеличит счетчик блокировки и дополнительно получит блокировку файла на уровне ОС, когда счетчик равен нулю. Аналогично, каждый вызов release() уменьшит счетчик блокировки и разблокирует файл, когда счетчик достигнет нуля.

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

  2. Точка with: предназначена для автоматического получения и освобождения блокировки после выхода ее объема. См. What is the python "with" statement designed for?.

  3. Блокировка файла используется для защиты от доступа к файлам за пределами текущего процесса. Он не используется для поточной блокировки. Используйте обычный threading.Lock для блокировки резьбы.

    # in __main__ or somewhere before we start the threads. 
    channel_lock = threading.Lock() 
    
    # in the worker thread 
    with channel_lock: 
        with open(...) as channel_file: 
         channel_file.write(...) 
    

Для деталей реализации можно сослаться на source code of py-filelock.

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

  • Нет связанных вопросов^_^