Wie kann eine Racebedingung verhindert werden, wenn mehrere Prozesse gleichzeitig versuchen, in eine Datei zu schreiben und aus dieser zu lesen?

Ich habe den folgenden Code (der Übersichtlichkeit halber vereinfacht):

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)

(Ein Teil des obigen Codes wurde von @ ausgeliehediese Antwort.)

Wenn mehrere Prozesse gleichzeitig ausgeführt werden, wird durch diesen Code nur einer geöffnet und in @ geschriebepyx_file (unter der Annahme vonpyx_file existiert noch nicht). Das Problem ist, dass dieser Prozess in @ schreipyx_file, die anderen Prozesse versuchen, @ zu ladpyx_file - Fehler werden in den letzteren Prozessen ausgelöst, weil sie zum Zeitpunkt des Lesenspyx_file, es ist unvollständig. (InsbesondereImportErrors werden ausgelöst, weil die Prozesse versuchen, den Inhalt der Datei zu importieren.)

Wie vermeide ich diese Fehler am besten? Eine Idee ist, dass die Prozesse weiterhin versuchen, @ zu importierepyx_file in einer while-Schleife, bis der Import erfolgreich ist. (Diese Lösung scheint suboptimal zu sein.)

Antworten auf die Frage(4)

Ihre Antwort auf die Frage