2017-04-22 80 views
0

我只想做的是做一個等待釋放鎖。開始在bash中同步的程序

我有例4(因爲我有4個核心),每個工作在一個項目的一部分相同的腳本,每個腳本看起來像這樣:

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

當我運行主腳本調用四個腳本,我希望每個腳本都能獨立工作,但是在某些時候,我希望每個腳本都在等待對方,因爲下一部分需要第一部分的所有數據。

現在我使用了一些邏輯,比如爲每個進程創建的文件或文件的數量,以及它們存在與另一個進行測試的情況。

我也得到了主意,用一個makefile,並有

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'。這樣,我可以重新使用我的shell腳本,並從pythons'threading'和其他功能中受益。 –

+0

@ansi_lumen:由於GIL,'threading'並不總是適合'python',它取決於工作量。 – cdarke

+1

@cdarke。真正。如果「線程」無法很好地擴展,仍然可以使用'multiprocessing'並執行實際的過程。主要想法是使用一個處理線程/分支比'bash'更方便的環境。 –

回答

0

要在Bash中實現此目的,一種方法是使用進程間通信使任務等待前一個任務完成。這是一個例子。

#!/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可以在任務B的任何地方,所以你可以做一些工作,然後等待(read)用於其他任務,然後繼續。您可以將任務A發送給任務B的許多信號以及幾個對應的語句read

如示例中所示,可以並行啓動多個管道。

這種方法的一個限制是管道在一個寫入器和一個讀取器之間建立通信通道。如果任務需要等待來自多個任務的信號,則需要FIFO以允許具有依賴關係的任務從多個源讀取。