stdin에서 파일 목록을 처리하는 작업이 있습니다. 프로그램의 시작 시간은 상당하며 각 파일에 걸리는 시간은 매우 다양합니다. 나는 많은 수의 프로세스를 생성하고 바쁘지 않은 프로세스를 파견하고 싶다. 내가 원하는 것을 거의 수행하는 몇 가지 명령 줄 도구가 있습니다. 거의 두 가지 작업 옵션으로 좁혔습니다.
find . -type f | split -n r/24 -u --filter="myjob"
find . -type f | parallel --pipe -u -l 1 myjob
문제는 split
순수한 라운드 로빈을 수행하므로 프로세스 중 하나가 뒤쳐지고 남아있어 전체 작업의 완료가 지연 된다는 것입니다. 반면 parallel
욕구는 N 라인 당 하나 개의 프로세스를 생성 또는 바이트의 입력을 내가 시작 오버 헤드 방법에게 너무 많은 시간을 보내는 바람합니다.
프로세스와 피드 라인을 재사용하여 차단되지 않은 stdin을 가진 프로세스에 재사용 할 수있는 이와 같은 것이 있습니까?
myjob
가 더 많은 입력을받을 준비가되어 있다는 것을 아는 것입니다 . 프로그램이 더 많은 입력을 처리 할 준비가되었음을 알 수있는 방법은 없습니다. 파이프 버퍼, stdio 버퍼와 같은 일부 버퍼가 더 많은 입력을받을 수 있다는 것만 알 수 있습니다. 프로그램이 준비되면 어떤 종류의 요청 (예 : 프롬프트 표시)을 보내도록 프로그램 할 수 있습니까?
read
호출에 반응하는 FUSE 파일 시스템이 트릭을 수행합니다. 그것은 상당히 큰 프로그래밍 노력입니다.
-l 1
하고 parallel
있습니까? IIRC는 작업 당 한 줄의 입력을 처리하도록 병렬로 지시합니다 (예 : myjob 포크 당 하나의 파일 이름, 많은 시작 오버 헤드).
split
명령은 어디 에서 왔습니까? 이름이 표준 텍스트 처리 유틸리티 와 충돌 합니다.