我正在使用一組計算機來執行一些並行計算。我的主目錄在羣集中共享。在一臺機器上,我有一個ruby代碼,它創建包含計算命令的bash腳本,並將腳本寫入〜/ q /目錄。這些腳本被命名爲* .worker1.sh,* .worker2.sh等。Python(或者一般的linux)文件操作流程控制或文件鎖定
在其他20臺機器上,我有20個python代碼運行(每臺機器一個),(不斷)檢查〜/ q /目錄並尋找屬於該機器的工作,使用Python代碼是這樣的:在
jobs = glob.glob('q/*.worker1.sh')
[os.system('sh ' + job + ' &') for job in jobs]
對於一些額外的控制,Ruby代碼將創建像workeri.start一個空文件(I = 1..20) q目錄後,它將bash腳本寫入q目錄,python代碼將在運行上述代碼之前檢查該「開始」文件。在bash腳本中,如果命令成功完成,bash腳本將創建一個像'workeri.sccuess'這樣的空文件,python代碼在運行上述代碼後檢查該文件,以確保計算成功完成。如果python發現計算成功完成,它將刪除q目錄中的'start'文件,以便Ruby代碼知道該作業成功完成。 20 bash腳本全部完成後,ruby代碼將創建新的bash腳本和python讀取並執行新的腳本等。
我知道這不是一種優雅的方式來協調計算,但我還沒有找到更好的溝通不同的機器之間。
現在的問題是:我預計20個職位會有點平行。完成20個工作的總時間不會比完成一份工作的時間長得多。但是,看起來這些作業是按順序運行的,而且時間比我預期的要長得多。
我懷疑,部分原因是多個代碼讀取和寫入一次相同的目錄,但Linux系統或Python鎖目錄,只允許一個進程oprate目錄。這使得代碼一次執行一個。
我不確定是否屬於這種情況。如果我將bash腳本分割到不同的目錄中,並讓不同機器上的python代碼讀取和寫入不同的目錄,是否可以解決問題?還是有其他原因導致問題?
非常感謝您的任何建議!如果我沒有清楚解釋什麼,請告訴我。
一些額外的信息: 我的主目錄是/家/ my_group/my_home,這裏是它 安裝信息:上/家庭/ my_group類型NFS /體積/ my_group(RW,爲nosuid,nodev,noatime的, TCP,Timeo酒店= 600,重傳= 2,RSIZE = 65536,WSIZE = 65536,地址= ...)
我說經常檢查將q目錄,這意味着一個Python循環是這樣的:
While True:
if 'start' file exists:
find the scripts and execute them as I mentioned above
什麼文件系統和安裝選項? – sarnold
...並且當你說_持續檢查'〜/ q /'目錄時,你是否真的意味着**不斷**?如在[忙碌圈]中(http://en.wikipedia.org/wiki/Busy_loop)? – sarnold
@sarnold我的主目錄應物理地位於單獨的文件服務器上。我相信這是ext3文件系統。以下是我在羣集的登錄節點上mount問題後得到的信息:/ vol/my_group在/ home/my_group類型nfs(rw,nosuid,nodev,noatime,tcp,timeo = 600,retrans = 2,rsize = 65536,wsize = 65536,addr = ...)我的主目錄是/ home/my_group/my_home/ – qkhhly