복붙노트

[PYTHON] 파이썬 읽기라는 PIPE

PYTHON

파이썬 읽기라는 PIPE

나는 리눅스에서 명명 된 파이프를 가지고 있고 그것을 파이썬에서 읽고 싶다. 문제는 파이썬 프로세스가 하나의 코어 (100 %)를 '소비'한다는 것입니다. 내 코드는 다음과 같습니다.

FIFO = '/var/run/mypipe'
os.mkfifo(FIFO)
with open(FIFO) as fifo:
    while True:
        line = fifo.read()

나는 '수면'이 파이프로부터 어떤 입력 데이터를 잃어 버릴 상황이나 과정을 도울 것인지 물어보고 싶다. 나는 데이터 입력 빈도를 알지 못하도록 입력을 제어 할 수 없다. 내가 선택 및 설문 조사에 대해 읽었지만 내 문제에 대한 모범을 찾지 못했습니다. 마지막으로 100 % 사용량이 데이터 입력 (손실 또는 무언가?)에 어떤 영향을 주는지 묻고 싶습니다.

편집 : 나는 루프를 깰 싶지 않아요. 프로세스가 계속 실행되고 파이프의 데이터를 듣고 싶습니다.

해결법

  1. ==============================

    1.일반적인 UNIX 방식에서, read (2)는 파일의 끝을 나타내는 0 바이트를 반환하는데 이는 다음을 의미 할 수 있습니다.

    일반적인 UNIX 방식에서, read (2)는 파일의 끝을 나타내는 0 바이트를 반환하는데 이는 다음을 의미 할 수 있습니다.

    귀하의 경우 fifo.read ()는 파일 설명자를 닫았 기 때문에 빈 문자열을 반환합니다.

    이 경우를 감지하고 루프를 벗어나야합니다.

    reader.py:

    import os
    import errno
    
    FIFO = 'mypipe'
    
    try:
        os.mkfifo(FIFO)
    except OSError as oe: 
        if oe.errno != errno.EEXIST:
            raise
    
    print("Opening FIFO...")
    with open(FIFO) as fifo:
        print("FIFO opened")
        while True:
            data = fifo.read()
            if len(data) == 0:
                print("Writer closed")
                break
            print('Read: "{0}"'.format(data))
    

    세션 예제

    터미널 1:

    $ python reader.py 
    Opening FIFO...
    <blocks>
    

    터미널 2:

    $ echo -n 'hello' > mypipe 
    

    터미널 1:

    FIFO opened
    Read: "hello"
    Writer closed
    $ 
    

    아마도 작가가 닫은 후에도 계속 파이프에서 글을 듣고 싶다는 뜻입니다.

    이를 효율적으로 수행하려면 다음과 같은 사실을 활용할 수 있어야합니다.

    여기에서는 열린 루프와 읽기 루프 주위에 다른 루프를 추가합니다. 이렇게하면 파이프가 닫히면 코드가 다시 열리므로 다른 작성기가 파이프를 열 때까지 차단됩니다.

    import os
    import errno
    
    FIFO = 'mypipe'
    
    try:
        os.mkfifo(FIFO)
    except OSError as oe:
        if oe.errno != errno.EEXIST:
            raise
    
    while True:
        print("Opening FIFO...")
        with open(FIFO) as fifo:
            print("FIFO opened")
            while True:
                data = fifo.read()
                if len(data) == 0:
                    print("Writer closed")
                    break
                print('Read: "{0}"'.format(data))
    

    터미널 1:

    $ python reader.py 
    Opening FIFO...
    <blocks>
    

    터미널 2:

    $ echo -n 'hello' > mypipe 
    

    터미널 1:

    FIFO opened
    Read: "hello"
    Writer closed
    Opening FIFO...
    <blocks>
    

    터미널 2:

    $ echo -n 'hello' > mypipe 
    

    터미널 1:

    FIFO opened
    Read: "hello"
    Writer closed
    Opening FIFO...
    <blocks>
    

    ... 등등.

    파이프에 대한 man 페이지를 읽으면 자세한 내용을 알 수 있습니다.

  2. from https://stackoverflow.com/questions/39089776/python-read-named-pipe by cc-by-sa and MIT license