2013-07-03 4 views
7

os.mkfifo을 프로그램 간 간단한 통신에 사용하고 싶습니다. 나는 루프에서 FIFO를 읽는 데 문제가 있습니다.fifo - 루프에서 읽기

내가 장난감과 함께 일하는 독자와 작가가있는이 장난감의 예를 생각해보십시오. FIFO에 들어가는 모든 것을 읽을 수있는 루프에서 독자를 실행할 수 있기를 원합니다.

# reader.py 
import os 
import atexit 

FIFO = 'json.fifo' 

@atexit.register 
def cleanup(): 
    try: 
     os.unlink(FIFO) 
    except: 
     pass 

def main(): 
    os.mkfifo(FIFO) 
    with open(FIFO) as fifo: 
#  for line in fifo:    # closes after single reading 
#  for line in fifo.readlines(): # closes after single reading 
     while True: 
      line = fifo.read()   # will return empty lines (non-blocking) 
      print repr(line) 

main() 

그리고 작가 :

# writer.py 
import sys 

FIFO = 'json.fifo' 


def main(): 
    with open(FIFO, 'a') as fifo: 
     fifo.write(sys.argv[1]) 

main() 

나는 while 루프 내에서 python reader.py 이후 python writer.py foo, "foo는"이 인쇄됩니다하지만 FIFO가 폐쇄되고 독자가 종료됩니다 (또는 회전을 실행하면). 독자가 계속 루프에 머물러 있기를 바란다. 그래서 나는 작가를 여러 번 실행할 수있다.

편집

나는 문제를 처리하기 위해이 코드를 사용

def read_fifo(filename): 
    while True: 
     with open(filename) as fifo: 
      yield fifo.read() 

을하지만 어쩌면 그것을 처리하는 몇 가지 깔끔한 방법은 ... 대신 반복적으로 파일을 여는,이

관련

답변

2

FIFO 정확히 이런 식으로 (독자 측에) 작동 : 모든 작가가 사라 때까지이에서 읽을 수 있습니다. 그런 다음 리더에게 EOF 신호를 보낸다.

독자가 계속 읽고 싶으면 다시 열고 읽어야 할 것입니다. 따라서 귀하의 스 니펫은 정확하게 갈 수있는 방법입니다.

여러 작성자가있는 경우 메일 작성을 위해 각자 작성한 데이터 부분이 PIPE_BUF보다 작아야합니다.

+0

필자는 여러 작성자의 경우 더 많은 것을 사용해야한다고 가정합니다. 여기서는 작성자가 서로 다른 FIFO를 닫을 것이기 때문입니다. 그리고 한 작가의 데이터가 다른 작가의 데이터와 섞여있을 수도 있습니다. –

+0

그들은 서로를 닫지 않으며 기록 된 데이터가 충분히 작 으면 방해받지 않습니다. 서로를 간섭하지 않으면 서 얼마나 큰 데이터 팩이 될 수 있는지 알려주는 상수'PIPE_BUF '가 있습니다. – glglgl

1

파일을 반복해서 다시 열지 않아도됩니다. 데이터를 사용할 수있을 때까지 선택을 사용하여 차단할 수 있습니다.

with open(FIFO_PATH) as fifo: 
    while True: 
     select.select([fifo],[],[fifo]) 
     data = fifo.read() 
     do_work(data) 

이 예에서는 EOF를 읽지 않습니다.