Файл не может быть найден, когда я использую #Fabric, вставил # в многопоточность, чтобы скопировать временный файл, созданный tempfile.mkstemp, в удаленный файл.

Версия Python: 2.6.4

Ткань Версия:1.9.0

У меня есть среда тестирования автоматизации для параллельного выполнения дел с использованием Threading.Thread(3 потока в моем случае).

Каждый рабочий поток использует матрицу put(хотя для этой функции мы делаем некоторую оболочку), чтобы скопировать временный файл, созданный tempfile.mkstemp, в удаленный файл.

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

вот код, когда делаю "поставить":

MyShell.py (Родительский класс MyFabShell)

def putFileContents(self, file, contents):

    fd, tmpFile= tempfile.mkstemp()

    os.system('chmod 777 %s' % tmpFile)

    contentsFile = open(tmpFile, 'w')
    contentsFile.write(contents)
    contentsFile.close()

    dstTmpFile = self.genTempFile()

    localshell = getLocalShell()

    self.get(localshell, tmpFile, dstTmpFile) # use local shell to put tmpFile to dstTmpFile


    os.close(fd)

    os.remove(tmpFile)
    #os.remove(tmpFile)

MyFabShell.py:

def get( self, srcShell, srcPath, dstPath ):
    srcShell.put( self, srcPath, dstPath )

def put(self, dstShell, srcpath, dstpath):

    if not self.pathExists( srcPath ):  # line 158
        raise Exception( "Cannot put <%s>, does not exist." % srcPath )

    # do fabric get/put in the following
    # ...

Вызов put приводит к ошибке:

...
self.shell.putFileContents(configFile, contents)
File "/path/to/MyShell.py", line 401, in putFileContents
self.get(localShell, tmpFile, dstTmpFile)
File "/path/to/MyFabShell.py", line 134, in get
srcShell.put( self, srcPath, dstPath )
File "/path/to/myFabShell.py", line 158, in put
raise Exception( "Cannot put <%s>, does not exist." % srcPath )
Exception: Cannot put </tmp/tmpwt3hoO>, does not exist.

Я изначально сомневаюсь, что файл может быть удален во время putтак я прокомментировал os.remove, Однако я снова получил ту же ошибку. Из журнала исключений это не должно быть проблемой 'fabric put', так как исключение выдает перед выполнением ткани get/put mkstemp НЕ безопасно, когда задействована многопоточность? но в документе написано, что "в создании файла нет условий гонки" или мой случай провалился из-за GIL? Я подозреваю, что это потому, что, когда я использую только 1 поток, все будет хорошо.

Может ли кто-нибудь дать мне понять мою ошибку? Я боролся с проблемой некоторое время:(

1 ответ

Моя проблема решается, когда я явно присоединяюсь к потоку. все мои потоки не являются потоками демонов, и каждый поток выполняет операции ввода-вывода (например, запись / чтение файла). 'join' явно гарантирует, что работа каждого потока завершена. Я до сих пор не уверен, что основная причина моей проблемы... временный файл на самом деле существует, но поток жалуется, что "не может найти", когда несколько потоков работают вместе, единственное предположение, которое я могу дать, это: когда поток A делает I / Во время операции поток A освобождает GIL, так что поток B(или C, D...) может получить GIL во время операции ввода / вывода A. проблема может произойти во время ввода / вывода, потому что поток A больше не находится в интерпретаторе Python... поэтому A "не может найти файл", однако, когда мы присоединяемся к A явно, A всегда проверяет завершите свою работу, повторно входя в GI(Global Interpreter).

Другие вопросы по тегам