실행하면 (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}