Shell-Script

bash 腳本中的多執行緒/分叉

  • August 1, 2014

我編寫了一個 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.

由於$inFile3500 多行,腳本需要 6-7 小時才能完全執行。為了盡量減少這個時間,我打算在這個腳本中使用多執行緒或分叉。$inFile如果我創建 8 個子程序,則將同時處理其中的 8 行。

如何才能做到這一點?

GNUparallel就是為這種事情而生的。您可以一次執行您的腳本多次,每次輸入來自輸入的不同數據:

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

引用自:https://unix.stackexchange.com/questions/147811