Что произойдет, если я войду в один и тот же файл из нескольких разных процессов в python?

Я потратил часы, чтобы выкопать поведение, сначала о тех вопросах:

Атомность `write (2)` к локальной файловой системеКак я могу синхронизировать - сделать атомарные - записи в один файл из двух процессов?Как программно определить, является ли системный вызов «write» атомарным для определенного файла?Что происходит, если системный вызов write вызывается для одного файла двумя разными процессами одновременноhttp://article.gmane.org/gmane.linux.kernel/43445

Кажется, если мы используем флаг 'O_APPEND' при открытии файла, всегда будет нормально войти в один и тот же файл из нескольких процессов в linux. И я верю, что Python наверняка использует флаг «O_APPEND» в своем модуле регистрации.

И из небольшого теста:

#!/bin/env python
import os
import logging

logger = logging.getLogger('spam_application')
logger.setLevel(logging.DEBUG)
# create file handler which logs even debug messages
fh = logging.FileHandler('spam.log')
logger.addHandler(fh)
formatter = logging.Formatter(
    '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)

for i in xrange(10000):
    p = os.getpid()
    logger.debug('Log line number %s in %s', i, p)

И я запускаю это с:

./test.py & ./test.py & ./test.py & ./test.py &

Я обнаружил, что в spam.log нет ничего плохого. Такое поведение может поддержать вывод выше.

Но проблемы не за горами:

Что это значитВот?И какие сцены использоватьэтотпросто для ротации файлов?

Наконец, если два процесса выполняют запись в один и тот же файл, я имею в виду, что они вызывают write (2) для одного и того же файла, которые следят за тем, чтобы данные двух процессов не чередовались (ядро или файловая система?) И как. [ ПРИМЕЧАНИЕ: я просто хочу подробно ознакомиться с системным вызовом write, любые сообщения об этом приветствуются.]

EDIT1:

Делатьэтот а такжеэтот просто существуют там для совместимости между различными средами ОС, такими как Windows, Linux или Mac?

EDIT2:

Еще один тест, каждый раз передавайте 8KB строки в logging.debug. И на этот раз я вижу поведение чередования в spam.log. Это поведение именно то, что указано о PIPE_BUF на одной странице выше. Таким образом, похоже, что поведение в linux очевидно, использование O_APPEND нормально, если размер записи (2) меньше, чем PIPE_BUF.

Ответы на вопрос(3)

Ваш ответ на вопрос