Как предотвратить состояние состязания, когда несколько процессов пытаются записать и затем прочитать из файла одновременно

У меня есть следующий код (упрощен для ясности):

import os
import errno
import imp


lib_dir = os.path.expanduser('~/.brian/cython_extensions')
module_name = '_cython_magic_5'
module_path = os.path.join(lib_dir, module_name + '.so')
code = 'some code'

have_module = os.path.isfile(module_path)
if not have_module:
    pyx_file = os.path.join(lib_dir, module_name + '.pyx')

    # THIS IS WHERE EACH PROCESS TRIES TO WRITE TO THE FILE.  THE CODE HERE 
    # PREVENTS A RACE CONDITION.
    try:
        fd = os.open(pyx_file, os.O_CREAT | os.O_EXCL | os.O_WRONLY)
    except OSError as e:
        if e.errno == errno.EEXIST:
            pass
        else:
            raise
    else:
        os.fdopen(fd, 'w').write(code)

# THIS IS WHERE EACH PROCESS TRIES TO READ FROM THE FILE.  CURRENTLY THERE IS A
# RACE CONDITION.
module = imp.load_dynamic(module_name, module_path)

(Часть приведенного выше кода заимствована изэтот ответ.)

Когда несколько процессов выполняются одновременно, этот код вызывает только один, чтобы открыть и записать вpyx_file (при условии,pyx_file не существует) Проблема в том, что, как этот процесс пишетpyx_file, другие процессы пытаются загрузитьpyx_file - ошибки возникают в последних процессах, потому что во время их чтенияpyx_fileнеполно. (В частности,ImportErrors возникают, потому что процессы пытаются импортировать содержимое файла.)

Как лучше всего избежать этих ошибок? Одна идея состоит в том, чтобы процессы пытались импортироватьpyx_file в цикле пока импорт не будет успешным. (Это решение кажется неоптимальным.)

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

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