2014-11-10 4 views
0

cat big_file|python do.py과 같은 명령을 사용하면 do.py 여러 스레드를 만들고 스레드가 stdin에서 데이터를 읽으면 stdin.readline을 호출하려면 threading.Lock()을 사용해야합니까?
처럼 :python에서 stdin.readline() atomic입니까?

with lock: 
    line = stdin.readline() 
do... 
+0

파일 개체 및'readline' 메서드에 대한 설명서를 읽었습니까? 어떤 종류의 스레드 안전성을 언급합니까? 따라서 ... – Bakuriu

+0

sys.stdin에 대한 python 문서를 읽었습니다. 그리고 원자에 대해서 뭔가를 보지 못했기 때문에 stdin.readline()이 쓰레드 안전인지는 모른다. –

답변

1

CPython과의 파일 API explicitly locks the file object 주위 readline 및 기타 통화, readline()을 의미 실제로 스레드 안전합니다. 이것은 파이썬의 파일 IO의 기본 기능을하는 C (POSIX) stdio의 역사적인 동작을 모방 한 것으로, 변경 될 가능성은 거의 없습니다. 그러나 이것이 명시 적으로 문서화되지 않았으므로 Jython이나 PyPy와 같은 다른 Python 구현에서는 그럴 수 없다는 경고를받습니다.

+0

대단히 감사합니다. 그런데 어떻게 cpython에서 관련 코드를 찾을 수 있습니까? 너 나 가르쳐 줄 수있어? 다시 한번 감사드립니다! –

+1

@kkerneo 소스는 내장 타입을 정의하는'Objects /'디렉토리, C로 작성된 stdlib 모듈을 포함하는'Modules /'디렉토리와 다른 pure-python stdlib 모듈을 포함하는'Lib /'디렉토리를 포함합니다. 인터프리터의 핵심 정의를 담고있는'Python /'디렉토리도있다. 저장소 온라인 [여기] (https://hg.python.org/cpython/file/03d6661c13a0)을 검색 할 수 있습니다. – Bakuriu

+0

Btw :이 답변은 기술적으로 올바르지 않습니다. 당신은 그 작업이 * thread-safe *임을 보여 주며, * atomic *가 아닙니다! 실제로 소스 코드에서 오류가 발생하면'readline'을 호출하는 동안 신호 처리기를 실행할 수 있습니다. 이러한 핸들러는 파일 객체에 대한 다른 호출을 수행하고 수정 된 상태를 볼 수 있습니다. Atomicity는 읽기가 완전히 수행되었거나 아무 것도하지 않는다는 것을 의미하지만 어떤 경우에는 일부 코드 *가 "부분 읽기 상태"로 객체를 볼 수 있기 때문에 그렇지 않습니다. – Bakuriu

1

하나의 전용 스레드가 sys.stdin (또는 다른 파일)의 행을 읽고 Queue.Queue 개체에 배치하는 것이 더 나을 것입니다. 작업자 스레드는 본질적으로 스레드로부터 안전한 대기 행렬을 가져옵니다.

다른 답변에서 언급 된 파일 잠금은 기본 OS가 지원하는 경우에만 표시됩니다 (flockfile()funlockfile()을 통해). 그렇지 않으면 작동하지 않습니다. 또한, 다른 파이썬 구현은 그것을 다르게 구현할 수도 있습니다.

Queue.Queue은 모든 OS 및 구현에서 일관된 동작을 제공합니다. 또 다른 장점은 호환 가능한 Queue 구현을 제공하는 multiprocessing 모듈로 쉽게 이동할 수 있다는 것입니다. 이를 통해 스레드를 여러 프로세서 시스템에서 성능 이점을 제공 할 수있는 별도의 프로세스로 이동할 수 있습니다.