GNU Parallel은 프로그램이 종료될 때까지 작업을 실행하지 않습니다.

GNU Parallel은 프로그램이 종료될 때까지 작업을 실행하지 않습니다.

실행하면 (rss-notifier 코드는 마지막에 포함되어 있습니다)

rss-notifier.zsh https://www.wuxiaworld.com/feed/chapters ".*"|parallel --null -k --lb echo {}

알겠어요,

Title: Sovereign of the Three Realms - 

답변1

당신은 두 가지 문제로 고민하고 있습니다.

이것

(seq 200; sleep 20) | parallel -j10  -k echo

인쇄:

1
2

그런 다음 완료될 때까지 중지합니다 sleep 20.

start_more_jobs()수정 사항의 일부가 루프 외부로 이동하는 것 같습니다 while.

--- a/src/parallel
+++ b/src/parallel
@@ -4062,9 +4062,8 @@ sub reaper {
        # $stiff = pid of dead process
        if(wantarray) {
            push(@pids_reaped,$stiff);
-       } else {
-           $children_reaped++;
        }
+       $children_reaped++;
         if($Global::sshmaster{$stiff}) {
             # This is one of the ssh -M: ignore
             next;
@@ -4112,12 +4111,12 @@ sub reaper {
             }
         }
        $job->cleanup();
-       start_more_jobs();
        if($opt::progress) {
            my %progress = progress();
            ::status_no_nl("\r",$progress{'status'});
        }
     }
+    if($children_reaped) { start_more_jobs(); }
     $opt::sqlmaster and $Global::sql->run("COMMIT;");
     debug("run", "done ");
     return wantarray ? @pids_reaped : $children_reaped;

짧은 작업이 많은 경우 이로 인해 일부 성능이 저하될 수 있습니다. 나는 많이 측정하지 않았습니다.

문제의 또 다른 부분은 GNU Parallel의 디자인 결정 때문입니다.

GNU Parallel의 매개변수는 다이아몬드 연산자(<>)를 사용하여 읽습니다. 계속하기 전에 전체 줄을 읽습니다. 읽기는 (sleep 20)완료될 때만 파일의 끝을 생성하므로 완료될 sleep때까지 차단됩니다 .sleep

sleep따라서 GNU Parallel이 마지막 바이트를 읽을 때 이것이 실제로 파일의 끝임을 발견하기 전에 완료될 때까지 기다려야 합니다 .

디자인의 이 부분을 바꾸는 쉬운 방법은 없다고 생각합니다.

다행스럽게도 작업을 실행할 때 볼 수 있듯이 이로 인해 작업 실행이 중단되지는 않습니다 date. 작업은 즉시 시작되고 출력을 기다립니다 sleep.

(seq 20; sleep 5) | parallel -j10  -k 'date;echo'

즉, 귀하의 문제는 와 관련되어 있습니다 -N2. 여기서는 문제가 표시되지 않습니다.

(printf '%s\0' {1..4}; sleep 2) | parallel --null -k --lb -N 2 echo {1} {2}

하지만 당신은할 수 있는여기에서 질문을 참조하세요. 이는 마지막 4-8개 요소 앞에서 일시 중지됩니다.

(printf '%s\0' {1..40}; sleep 2) | parallel -j4 --null -k --lb -N 2 echo {1} {2}

이는 마지막 8-10개 요소 앞에서 일시 중지됩니다.

(printf '%s\0' {1..40}; sleep 2) | parallel -j8 --null -k --lb -N 2 echo {1} {2}

다음을 실행하여 date확인할 수 있습니다 . 문제는 작업 시작이 아니라 인쇄가 지연되는 것뿐입니다.

(printf '%s\0' {1..40}; sleep 2) | parallel -j4 --null -k --lb -N 2 'date;'echo {1} {2}

관련 정보