2010-01-26 5 views
4

os.mkfifo() 명령을 통해 명명 된 파이프가 생성되었습니다. 두 개의 다른 파이썬 프로세스가이 명명 된 파이프에 액세스하고 프로세스 A가 읽고 프로세스 B가 쓰고 있습니다. 프로세스 A는 선택 기능을 사용하여 FIFO/파이프에서 사용 가능한 데이터가 언제 있는지를 결정합니다. 프로세스 B가 각 쓰기 호출 후에 플러시한다는 사실에도 불구하고 프로세스 A의 선택 기능이 항상 반환되는 것은 아닙니다 (새 데이터가없는 것처럼 계속 차단됩니다). 이 문제를 광범위하게 조사한 후에 프로세스 B가 실제 호출 전후 5KB의 가비지 쓰기를 추가하도록 프로그래밍했으며, 마찬가지로 프로세스 A는이 5KB를 무시하도록 프로그래밍되었습니다. 이제 모든 것이 잘 작동하고 select는 항상 적절하게 반환됩니다. 프로세스 B가 죽을 경우 프로세스 A의 select가 반환된다는 것을 알면이 해킹 해결책에 도달하게됩니다 (쓰기 및 플러시 후에 읽기 파이프에서 잠들 것입니다). 명명 된 파이프에 대한 Python 플러시에 문제가 있습니까?명명 된 파이프가 파이썬에서 플러시되지 않습니다.

+0

문제를 나타내는 최소 테스트 코드를 게시 할 수 있습니까? 당신이 12 줄의 문제에 대해 충분히 설명해야한다고 설명합니다. – kriss

답변

0

플러시 작업은 명명 된 파이프와 관련이 없습니다. 명명 된 파이프의 데이터는 메모리에 엄격하게 보관되며 읽기 전이나 FIFO가 닫힐 때까지 해제되지 않습니다.

+3

파이프로의 데이터 출력이 응용 프로그램 수준에서 버퍼링되면 플러시 작업이 여전히 관련 될 수 있습니다. –

+0

응용 프로그램 수준에서 버퍼링하는 것으로 추측하고 있습니다. 버그를 아는 사람이 있습니까? – BrainCore

1

어떤 API를 사용하고 있습니까? os.read()os.write()은 아무 것도 버퍼링하지 않습니다.

1

파이썬의 내부 버퍼링이 문제를 일으키는 지 알아 보려면 스크립트를 실행할 때 "파이썬"대신 "파이썬 -u"를 사용하십시오. 이것은 파이썬을 강제로 "unbuffered mode"로 만들 것이고, 이는 모든 출력을 순간적으로 출력 할 것입니다.

관련 문제