2017-10-08 13 views
0

5秒ごとにスレッドを生成するループがあり、各スレッドはpythonでfilelockモジュールを使用して同じファイルを追加しようとしていますが、ファイルを - 書き込み"a"(スレッドとファイルロックの使用)を使用した後でもpython 2.7ファイルが上書きされる

import threading 
import filelock 

def loop(): 

    threading.Timer(5,loop).start() 
    lock = filelock.FileLock("PATH", timeout=20) 
    with lock.acquire(timeout=0.1, poll_intervall=0.01): 
     with open("PATH", "a") as myFile: 
      myFile.write("DATA\n\n") 
    lock.release() 

編集:追加情報: 複数の反復の後、私はファイルで検出されたデータは、最後のスレッドと初めてではないからでした。

編集:以下のgeorgexshによってコメントされているように、appendはアトミックなので、ロックを必要としません。

+0

ドキュメントは、 'FileLock'のfileパラメータには書き込まないようにしています。 – quamrana

+0

FileLockクラスで指定されたファイルパラメータではなく、外部ファイルへの書き込みです。 – ubanthia

+0

'FileLock'の呼び出しは" PATH "を引用します。あなたの 'open()'呼び出しは "PATH"も引用します。あなたが書き込みたいロックとファイルの両方として "PATH"を使用していると私は思っています。 – quamrana

答えて

0

withステートメントのコンテキストマネージャーとしてロックオブジェクトを使用するコードでは、withブロックが終了するとロックが解除されるため、このfilelock packageを使用しているとします。

ロックファイルへのデータ書き込みは賢明ではありません。ロックを取得すると、ロックファイルは長さ0に切り捨てられます。as O_TRUNC being used。あなたがするインナーwithブロック変更した場合

:あなたが予想されるとして、それを保持するファイルのロックを取得し

import time 

with lock.acquire(timeout=0.1, poll_intervall=0.01): 
    with open("PATH", "a") as myFile: 
     myFile.write("DATA\n\n") 
    time.sleep(1000) 

最初のスレッドは、他のスレッドはブロックされます。


+0

私の場合、ファイルには最新のスレッドのデータがあり、以前のすべてのスレッドのデータは削除されています。また、私のコードは時間を意識していると仮定されるので、私はtime.sleep()を使用することはできません。はい、私はファイルロックパッケージを使用しています。 – ubanthia

+0

@ubanthiaあなたは何を達成しようとしていますか? – georgexsh

+0

私は複数のpythonスクリプトと各スクリプトが数秒ごとに新しいスレッドをリリースしてファイルにデータを追加しようとしています。 Algo取引目的のため。 – ubanthia

0

私はあなたがこれを行うことを意味想定しています

import threading 
import filelock 

def loop(): 

    threading.Timer(5,loop).start() 
    lock = filelock.FileLock("FILELOCK", timeout=20) 
    with lock.acquire(timeout=0.1, poll_intervall=0.01): 
     with open("PATH", "a") as myFile: 
      myFile.write("DATA\n\n") 
    # lock.release() <== release not needed after 'with'? 

このコードは、ロック機構としてファイルFILELOCKを使用しています。これにより、ファイル "PATH"は自由に必要な内容を保持したままになります。

私はあなたの元のコードでは、FileLockソフトウェアは、ファイルやopenを呼び出し、writeは、ファイルの先頭に書き込み、最後のスレッドをクリアする(APPENDを使用していない)ファイルに何かを書き込む推測しています。

+0

実際には最後の書き込みはありません....すべての書き込みは上記のコードによって '追加'されます。私はgeorgexshから、ロックは追加のために必要でないという解決策を得ましたが、私はまだその動作を説明することはできません。 – ubanthia

関連する問題