Файл не может быть найден, когда я использую #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).