일반적으로 Unix의 파이프는 두 명령을 연결하고 첫 번째 명령의 출력을 두 번째 명령의 입력으로 사용하는 데 사용됩니다. 그러나 최근에 나는 파이프를 사용하여 여러 명령을 병렬로 실행하는 아이디어를 생각해 냈습니다(이것은 새로운 것이 아닐 수도 있지만 인터넷 검색에서 많이 찾지 못했습니다).
command1 | command2
이는 병렬로 호출 command1
되며command2
command2
표준 입력에서 읽지 않거나 command1
표준 출력에 쓰지 않는 경우t. 이를 설명하기 위한 최소한의 예(대화형 쉘에서 실행하십시오)
ls . -R 1>&2|ls . -R
내 질문은 파이프를 사용하여 이런 식으로 두 명령을 병렬로 실행하는 데 단점이 있습니까? 이 아이디어에 제가 놓친 부분이 있나요?
미리 감사드립니다.
답변1
명령 파이프라인은 이미 병렬로 실행되고 있습니다. 사용 명령:
command1 | command2
command1
둘 다 command2
시작되었습니다. 예약되어 있고 command2
파이프가 비어 있으면 읽기를 기다리는 것이 차단됩니다. command1
파이프에 쓰려고 하는데 파이프가 가득 차면 쓸 command1
공간이 생길 때까지 차단됩니다. 그렇지 않으면 command1
및 둘 다 command2
병렬로 실행되어 파이프에 쓰고 파이프에서 읽습니다.
답변2
단점이 있습니다..
- 볼 수 없는 출력
command1
command2
출력을 읽지 않으면command1
후자는 특정 양의 출력을 쓴 후 중단됩니다(4K를 보았지만 실험에 따르면 적어도 Python 프로세스의 경우 제한은 약 58K입니다. 아래 참조). 이는 사용되는 런타임에 따라 달라질 수 있습니다command1
.command2
이전에 중지되어command1
표준command1
출력에 기록된 경우 다음을 얻습니다.[Errno 32] Broken pipe
실험:
지침 1#! /usr/bin/python3
import sys,time
for i in range(64):
print ("*"*1023,file=sys.stdout)
print ("cmd1 here (%d)" % i,file=sys.stderr)
time.sleep(.1)
print ("cmd1 exiting",file=sys.stderr)
지침 2
#! /usr/bin/python3
import sys,time
for i in range(16):
print ("cmd2 here (%d)" % i,file=sys.stderr)
time.sleep(1)
print ("cmd2 exiting",file=sys.stderr)
달리기:
./cmd1 | ./cmd2
당신은 볼 수 있습니다 :
cmd1
반복 58에서 중지됩니다(cmd2는 출력에서 아무것도 읽지 않기 때문입니다).cmd1
종료 시 cmd2 충돌(깨진 파이프)
네, 어쩌면 효과가 있을 수도 있습니다. 아마.