コマンドが1秒あたり平均5回実行されるようにするにはどうすればよいですか?

コマンドが1秒あたり平均5回実行されるようにするにはどうすればよいですか?

API呼び出しを実行し、結果としてデータベースを更新するコマンドラインスクリプトがあります。

APIプロバイダで1秒あたり5つのAPI呼び出し制限を設定しました。スクリプトの実行には0.2秒以上かかります。

  • コマンドを順次実行すると、速度が十分に高速ではなく、1秒あたり1〜2回のAPI呼び出しのみが受信されます。
  • 複数の端末で同時にコマンドを順番に実行すると、1秒あたり5回の呼び出し制限を超える可能性があります。

コマンドラインスクリプトが毎秒約5回実行されるようにスレッドを調整する方法はありますか?

たとえば、プログラムは5つまたは10のスレッドを使用して実行され、前のスレッドが200ミリ秒以内にスクリプトを実行した場合、スレッドはスクリプトを実行しません。

ベストアンサー1

GNUシステムにある場合は、pv次のことができます。

cmd='
   that command | to execute &&
     as shell code'

yes | pv -qL10 | xargs -n1 -P20 sh -c "$cmd" sh

同時に最大-P2020個まで実行できます。$cmd

-L10速度を毎秒10バイトまたは毎秒5行に制限します。

$cmd■速度が遅くなり、20の制限に達すると、少なくとも1つのインスタンスが返されるxargsまで読み取りが停止します。パイプへの書き込みは、パイプがいっぱいになるまで同じ速度で続きます(デフォルトのパイプサイズが64KiBのLinuxではほぼ2時間かかります)。$cmdpv

その時点ではpv書き込みが中断されます。しかし、そのような場合でも、xargs読み取りが再開されるpvと、平均平均毎秒5行を維持するために、できるだけ早く転送する必要があるすべてのラインに追いついて転送しようとします。

つまり、20のプロセスが毎秒5回の平均実行要件を満たすことができれば、そうすることができます。ただし、制限に達すると、新しいプロセスが開始される速度はPVのタイマーによって制御されなくなり、以前のcmdインスタンスから返された速度によって決まります。たとえば、現在20個が実行中で10秒間実行されており、そのうち10個がすべてのジョブを同時に完了することを決定した場合、10個の新しいジョブがすぐに開始されます。

例:

$ cmd='date +%T.%N; exec sleep 2'
$ yes | pv -qL10 | xargs -n1 -P20 sh -c "$cmd" sh
09:49:23.347013486
09:49:23.527446830
09:49:23.707591664
09:49:23.888182485
09:49:24.068257018
09:49:24.338570865
09:49:24.518963491
09:49:24.699206647
09:49:24.879722328
09:49:25.149988152
09:49:25.330095169

実行間の遅延時間が常に正確に0.2秒ではなくても、平均して1秒あたり5回です。

使用ksh93(またはコマンドが小数秒をサポートしてzshいる場合は使用sleep):

typeset -F SECONDS=0
n=0; while true; do
  your-command &
  sleep "$((++n * 0.2 - SECONDS))"
done

ただし、同時実行数に制限はありませんyour-command

おすすめ記事