
생산자의 표준 출력을 복사하여 두 소비자에게 동시에 공급해야 합니다.동기식패션.
consumer 1
producer | duplicator |
consumer 2
이는 다음과 같은 방법으로 쉽게 수행할 수 있습니다 tee
.
((cat f.txt | tee /dev/stderr | ./cons1.py >&3) 2>&1 | ./cons2.py) 3>&1
또는 명명된 파이프를 통해:
mkfifo fifo1 fifo2
cat f.txt | tee fifo1 fifo2 >/dev/null &
< fifo1 ./cons1.py &
< fifo2 ./cons2.py
dup.c
아니면 마지막으로 동일한 작업을 수행하는 프로그램을 작성할 수도 있습니다 .
#include <stdio.h>
int main()
{
char *line = NULL;
size_t size;
while (getline(&line, &size, stdin) != -1) {
fprintf(stdout, "%s", line);
fprintf(stderr, "%s", line);
}
return 0;
}
그런 다음:
((cat f.txt | ./dup | ./cons1.py >&3) 2>&1 | ./cons2.py) 3>&1
하지만,소비자 1이 소비자 2보다 빠르면 문제가 발생합니다.. 예를 들어 소비자 1은 이미 행 50,000에 있고 소비자 2는 행 17,000에 있습니다.
내 시스템을 위해두 소비자가 모두 같은 회선에 있어야 하므로 더 빠른 소비자를 제한해야 합니다.. 나는 이것이 Linux 표준 도구를 통해서는 불가능할 수도 있다는 것을 알고 있습니다. 그러나 적어도 이 dup.c
접근 방식을 사용한다면 가능합니다. 이를 달성하는 방법에 대한 제안이 있으십니까? 감사해요!
답변1
원하는 것을 달성하는 보편적인 방법은 없습니다.
기본적인 문제는 파이프가 단방향이고 생산자는 소비자의 현재 상태와 파이프로 전송된 데이터가 소비되었는지 전혀 알 수 없다는 것입니다.
따라서 이 제한 사항을 해결하는 방법에는 두 가지가 있으며 두 가지 모두 필요합니다.선험적으로데이터와 소비자에 대해 알아야 할 사항:
생산(또는 원래 생산자에서 소비자 파이프로의 전송)을 너무 느리게 만들어 소비자가 항상 동기화되도록 합니다. 즉, 각 생산 라인이 소비를 위해 전송된 후 다음 라인을 보낼 때 소비자 100%가 처리를 완료해야 할 정도로 오래 기다립니다( TiberiusKirk의 제안과 유사)
소비자의 처리 진행 상황을 확인하여 입력 행을 소비했는지 확인합니다. 이를 위해서는 소비자의 피드백이나 출력이 필요하며 존재할 수도 있고 존재하지 않을 수도 있고 실행 가능하게 처리될 수도 있고 그렇지 않을 수도 있습니다.
첫 번째 솔루션에는 입력 데이터의 처리 시간 추정에 대한 적절한 하한이 필요하고, 두 번째 솔루션에는 소비자로부터 일종의 피드백이 필요합니다.
답변2
파일 읽기 속도를 늦추어 더 빠른 소비자가 기다리게 할 수 있는 옵션이 있습니까?
while read LINE; do
echo "$LINE" | tee /dev/stderr | ./consumer1.py ; ) 2>&1 | ./consumer2.py
sleep 0.01
done < "file.txt"
그러나 일부 시스템에서는 1초 미만의 수면 시간은 선택 사항이 아닙니다.