병렬 명령으로서의 파이프

병렬 명령으로서의 파이프

일반적으로 Unix의 파이프는 두 명령을 연결하고 첫 번째 명령의 출력을 두 번째 명령의 입력으로 사용하는 데 사용됩니다. 그러나 최근에 나는 파이프를 사용하여 여러 명령을 병렬로 실행하는 아이디어를 생각해 냈습니다(이것은 새로운 것이 아닐 수도 있지만 인터넷 검색에서 많이 찾지 못했습니다).

command1 | command2

이는 병렬로 호출 command1되며command2command2표준 입력에서 읽지 않거나 command1표준 출력에 쓰지 않는 경우t. 이를 설명하기 위한 최소한의 예(대화형 쉘에서 실행하십시오)

ls . -R 1>&2|ls . -R

내 질문은 파이프를 사용하여 이런 식으로 두 명령을 병렬로 실행하는 데 단점이 있습니까? 이 아이디어에 제가 놓친 부분이 있나요?

미리 감사드립니다.

답변1

명령 파이프라인은 이미 병렬로 실행되고 있습니다. 사용 명령:

command1 | command2

command1둘 다 command2시작되었습니다. 예약되어 있고 command2파이프가 비어 있으면 읽기를 기다리는 것이 차단됩니다. command1파이프에 쓰려고 하는데 파이프가 가득 차면 쓸 command1공간이 생길 때까지 차단됩니다. 그렇지 않으면 command1및 둘 다 command2병렬로 실행되어 파이프에 쓰고 파이프에서 읽습니다.

답변2

단점이 있습니다..

  1. 볼 수 없는 출력command1
  2. command2출력을 읽지 않으면 command1후자는 특정 양의 출력을 쓴 후 중단됩니다(4K를 보았지만 실험에 따르면 적어도 Python 프로세스의 경우 제한은 약 58K입니다. 아래 참조). 이는 사용되는 런타임에 따라 달라질 수 있습니다 command1.
  3. 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 충돌(깨진 파이프)

네, 어쩌면 효과가 있을 수도 있습니다. 아마.

관련 정보