Como evitar uma condição de corrida quando vários processos tentam gravar e ler de um arquivo ao mesmo tempo

Eu tenho o seguinte código (simplificado para maior clareza):

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)

(Parte do código acima é emprestado deesta resposta.)

Quando vários processos são executados ao mesmo tempo, esse código faz com que apenas um seja aberto e gravado empyx_file (assumindopyx_file ainda não existe). O problema é que, enquanto esse processo está gravando parapyx_file, os outros processos tentam carregarpyx_file - erros são gerados nos últimos processos, porque no momento em que eles lêempyx_file, está incompleto. (Especificamente,ImportErrors são gerados, porque os processos estão tentando importar o conteúdo do arquivo.)

Qual é a melhor maneira de evitar esses erros? Uma idéia é fazer com que os processos continuem tentando importarpyx_file em um loop while até que a importação seja bem-sucedida. (Esta solução parece subótima.)

questionAnswers(2)

yourAnswerToTheQuestion