2017-04-22 2 views
0

私がやりたいことは、リリースロックを待つことです。 (私は4コアを持っているので)、私は例4のために持っているbashで同期プログラムを開始

各スクリプトは、そのように見えるプロジェクトの一部にそれぞれの作品の同一スクリプト:

#!/bin/bash 
./prerenderscript $1 
scriptsync step1 4 
./renderscript $1 
scriptsync step2 4 
./postprod $1 

私は4を呼び出すメインスクリプトを実行します私は各スクリプトを個別に動作させたいが、ある時点では、次の部分は最初の部分のすべてのデータが必要であるため、各スクリプトをお互いに待たせたい。

今のところ私は、プロセスごとに作成されるファイルまたはファイルの数、およびそれらの存在が他のものとテストされるようないくつかのロジックを使用しました。

私はまた、メイクファイルを使用すると

prerender%: source 
    ./prerender [email protected] 
renderscript%: prerender1 prerender2 prerender3 prerender4 
    ./renderscript [email protected] 
postprod: renderscript1 renderscript2 renderscript3 renderscript4 
    ./postprod [email protected] 

を持つようにアイデアを得た。しかし、実際のプロセスがここに簡素化されたスクリプトは、より複雑で、ステップごとにスレッドが彼の変数を維持する必要があります。

プレースホルダーコマンドのscriptsyncではなく、スクリプトを同期させるための方法はありますか。

+0

私はラッパーとしてpythonスクリプトを使用し、 'threading'で動作します。このようにして、私はシェルスクリプトを再利用することができ、pythons 'threading'やその他の機能を利用することができます。 –

+0

@ansi_lumen: 'threading'は、GILのために' python'には必ずしも適切ではなく、作業負荷に依存します。 @ cdarke。 – cdarke

+1

真実。スレッド化がうまく拡張できない場合、 'multiprocessing'を使用して実際の処理を行うことができます。主なアイデアは、 'bash'よりも便利なスレッド/フォークを扱う環境を使うことでした。 –

答えて

0

これを実現する方法の1つは、プロセス間通信を使用して、前のタスクが完了するまでタスクを待機させることです。ここに例があります。

#!/bin/bash 

# $1 is received to allow for an example command, not required for the mechanism suggested 
task_a() 
{ 
# Do some work 
sleep $1 # This is just a dummy command as an example 
echo "Task A/$1 completed" >&2 
# Send status to stdin, telling next task to proceed 
echo "OK" 
} 

task_b() 
{ 
IFS= read status ; [[ $status = OK ]] || return 1 
# Do some work 
sleep $1 # This is just a dummy command as an example 
echo "Task B/$1 completed" >&2 
} 

task_a 2 | task_b 2 & 
task_a 1 | task_b 1 & 
wait 

あなたは続行、その後、他のタスクのために(read)待って、あなたはいくつかの作業を行うことができるようにreadは、タスクBのどこにでも可能性があることに気づくでしょう。あなたはタスクAからタスクBに送られた多くの信号と、いくつかの対応するreadステートメントを持つことができます。

例に示すように、いくつかのパイプラインを並行して起動できます。

このアプローチの1つの制限は、パイプラインが1つのライタと1つのリーダの間に通信チャネルを確立することです。タスクが複数のタスクからの信号を待つ必要がある場合、依存関係を持つタスクが複数のソースから読み取れるようにするにはFIFOが必要です。

関連する問題