この質問は何度か聞かれますが、適切な答えが見つかりませんでした。私は今、良い解決策を見つけたと思います!
残念ながらparallel
、標準ディストリビューションには含まれていませんが、make には含まれています。-j
並列にするスイッチがあります。
man make(1) ]: ( make の並列実行に関する詳細情報)
-j [jobs], --jobs[=jobs]
Specifies the number of jobs (commands) to run simultaneously. If
there is more than one -j option, the last one is effective. If
the -j option is given without an argument, make will not limit
the number of jobs that can run simultaneously.
したがって、適切なMakefile
方法で問題を解決できます。
.PHONY: all $(PHP_DEST)
# Create an array of targets in the form of PHP1 PHP2 ... PHP90
PHP_DEST := $(addprefix PHP, $(shell seq 1 1 90))
# Default target
all: $(PHP_DEST)
# Run the proper script for each target
$(PHP_DEST):
N=$(subst PHP,,$@); php path$N/some_job_$N.php
呼び出しごとに 90 個のPHP#
ターゲットが作成されますphp path#/some_job_#.php
。実行するmake -j 5
と、php の 5 つのインスタンスが並列に実行されます。1 つが終了すると、次が開始されます。
の名前を に変更Makefile
しparallel.mak
、実行して最初の行chmod 700 parallel.mak
に追加#!/usr/bin/make -f
しました。として呼び出すことができるようになりまし./parallel.mak -j 5
た。
または、より洗練された-l
スイッチを使用することもできます。
-l [load], --load-average[=load]
Specifies that no new jobs (commands) should be started if there
are others jobs running and the load average is at least load (a
floating-point number). With no argument, removes a previous load
limit.
この場合、makeは、システムの負荷に応じて起動できるジョブの数を決定します。
私はそれをテストし./parallel.mak -j -l 1.0
、うまく動作しました。引数なしで最初に4つのプログラムを並行して開始した-j
ということは、できるだけ多くのプロセスを並行して実行することを意味します。