2010-03-11 50 views
60

我想在我的shell腳本中引入多線程功能。Bash中的多線程

我有一個腳本,它調用具有不同參數的函數read_cfg()。 這些函數調用都是獨立的。

是否可以並行地實例化這些函數調用(不是腳本)。 請讓我怎麼做到這一點..?

+0

這不是多線程 - 這是多。每個實例都運行在一個獨特的過程中,用'fork()'從原始複製過來。這些進程 - 與線程不同 - 具有它們自己的文件描述符表,並且它們的內存是寫入時拷貝(因此,當它們更改變量的值時,父進程不會看到它)。 – 2016-09-21 22:48:47

回答

127

當然,只是添加&指令後:

read_cfg cfgA & 
read_cfg cfgB & 
read_cfg cfgC & 
wait 

所有這些工作將隨後在後臺同時運行。可選的wait命令將等待所有作業完成。

每個命令都會在一個單獨的進程中運行,所以它在技術上不是「多線程」,但我相信它可以解決您的問題。

+6

您應該讀取進程和線程之間的區別。你提出的不是多線程 - 它涉及每個命令的單獨進程。 – TomTom 2010-03-11 14:56:00

+24

@TomTom:我當然知道進程和線程之間的區別。如果你看到OP的單詞選擇,我相信他只是問是否可以並行運行命令(這是可能的)。我添加了一個關於此的說明來澄清。 – Martin 2010-03-11 14:59:44

19

Bash作業控制涉及多個進程,而不是多線程。

您可以使用&後綴在後臺執行命令。

您可以等待使用wait命令完成後臺命令。

您可以通過將它們與|分開來並行執行多個命令。這也提供了同步機制,因爲在|左邊的命令的標準輸出連接到右邊的命令標準輸出。

23

您可以並行運行多個腳本副本,每個副本用於不同的輸入數據,例如,處理所有* .cfg文件保存於4芯:

ls *.cfg | xargs -P 4 -n 1 read_cfg.sh 

的read_cfg.sh腳本只接受一個參數(如強制執行由-N)

+2

只是一個說明,你應該指定'read_cfg.sh'或'xargs'的完整路徑將會說它找不到該文件。 – Jeshurun 2013-07-16 10:22:14

+0

更好地使用'printf'%s \ 0'* .cfg | xargs -0 ...' - 這種方式適用於帶有空格,不可打印字符等的文件名。另請參閱[爲什麼不應該解析ls(1)的輸出](http://mywiki.wooledge.org/ParsingLs)。 – 2016-09-21 22:49:28