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

あなたは2つの問題に悩んでいます。

これ

(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のパラメータはダイヤモンド演算子(<String>)を使用して読み取られます。続行する前に行全体を読みます。読み取りは(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}

おすすめ記事