Shell-Script
bash 腳本中的多執行緒/分叉
我編寫了一個 bash 腳本,格式如下:
#!/bin/bash start=$(date +%s) inFile="input.txt" outFile="output.csv" rm -f $inFile $outFile while read line do -- Block of Commands done < "$inFile" end=$(date +%s) runtime=$((end-start)) echo "Program has finished execution in $runtime seconds."
while
循環將從 讀取,$inFile
在行上執行一些活動並將結果轉儲到$outFile
.由於
$inFile
3500 多行,腳本需要 6-7 小時才能完全執行。為了盡量減少這個時間,我打算在這個腳本中使用多執行緒或分叉。$inFile
如果我創建 8 個子程序,則將同時處理其中的 8 行。如何才能做到這一點?
GNU
parallel
就是為這種事情而生的。您可以一次執行您的腳本多次,每次輸入來自輸入的不同數據:cat input.txt | parallel --pipe your-script.sh
預設情況下,它將根據系統上的處理器數量生成程序,但您可以使用
-j N
.一個特別巧妙的技巧是 shebang-wrapping 功能。如果將 Bash 腳本的第一行更改為:
#!/usr/bin/parallel --shebang-wrap --pipe /bin/bash
並在標準輸入上提供數據,然後這一切都會自動發生。當您有必須在最後執行的清理程式碼時,這不太有用,您可以這樣做。
有幾點需要注意。一是它將您的輸入分成連續的塊並一次使用這些塊 - 它不會交錯行。另一個是這些塊按大小拆分,而不考慮有多少記錄。您可以使用
--block N
以字節為單位設置不同的塊大小。在您的情況下,不超過文件大小的八分之一應該是正確的。您的文件聽起來可能小到足以在一個塊中結束,否則會破壞目的。對於特定的不同案例有很多選項,但是本教程很好地涵蓋了所有內容。您可能還感興趣的選項包括
--round-robin
和--group
。