2017-10-08 15 views
0

나는 5 초마다 쓰레드를 생성하는 루프를 가지고 있으며, 각 쓰레드는 파이썬에서 파일 잠금 모듈을 사용하여 같은 파일을 추가하려하지만 끝나는 것처럼 보인다. 추가 정보 : : 파일을파이썬 2.7 파일은 "a"(쓰레드와 파일 락 사용)를 사용한 후에도 덮어 쓴다.

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() 

편집 -writing 여러 반복 후를, 내가 파일에있는 데이터는 마지막 스레드에서이었고, 처음 없습니다.

편집 : 아래의 georgexsh에서 주석 처리 한대로 append는 원자 적이며 따라서 잠금을 필요로하지 않습니다.

+0

docs는'FileLock'의 file 매개 변수가 쓰여지지 않아야한다고 생각합니다. – quamrana

+0

FileLock 클래스에서 제공하는 file 매개 변수가 아닌 외부 파일에 쓰고 있습니다. – 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

여러 파이썬 스크립트를 통해 파일에 데이터를 추가하려고하는데 각 스크립트는 몇 초마다 새 스레드를 릴리스합니다. 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이 파일의 시작 부분에 기록하는 마지막 스레드를 클리어 파일 (추가를 사용하지 않음)에 뭔가를 기록하는 추측하고있다.

+0

실제로 마지막 쓰기가 없습니다 .... 모든 쓰기는 위에서 언급 한 코드에 '추가'됩니다. georgexsh에서 잠금 장치를 추가 할 필요가 없다는 해결책이 있지만 여전히 그 동작을 설명 할 수는 없습니다. – ubanthia