0

Python バージョン: 2.6.4

生地のバージョン:1.9.0

threading.Thread(私の場合は3つのスレッド)を使用して、ケースを並行して実行する自動化テストフレームワークがあります。

各スレッド ワーカーは、fabric 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ました。しかし、再び同じエラーが発生しました。例外ログから、ファブリック get/put の実行前に例外がスローされるため、「fabric put」の問題ではないはずmkstempです マルチスレッドが関係している場合は安全ではありませんか? しかし、ドキュメントには「ファイルの作成に競合状態はありません」と書かれていますか、それともGILが原因で私のケースは失敗しますか? これは、スレッドを 1 つだけ使用するとすべてがうまくいくためだと思われます。

誰かが私のエラーの手がかりを教えてくれますか? 私はしばらくの間、問題に苦しんでいます:(

4

1 に答える 1

0

スレッドに明示的に「参加」すると、私の問題は解決します。私のスレッドはすべてデーモンスレッドではなく、各スレッドにはほとんどの I/O 操作 (ファイルの書き込み/読み取りなど) があります。「結合」は、各スレッドのジョブが確実に完了するように明示的に行います。問題の根本的な原因はまだわかりません...一時ファイルは実際にありますが、複数のスレッドが一緒に動作しているときにスレッドが「見つかりません」と不平を言います。私が推測できる唯一の推測は次のとおりです。 O操作では、スレッドAはGILを解放して、スレッドB(またはC、D ...)がAのI / O操作時間中にGILを取得できるようにします。スレッド A が Python インタープリターに存在しなくなったため、I/O 時間中に問題が発生する可能性があります。これが、A が「ファイルを見つけることができない」理由ですが、明示的に A に参加すると、

于 2014-07-04T06:52:08.277 に答える