2017-07-19 66 views
2

我從bash運行php,並在文本文件中循環儘可能多的行。在Bash腳本中的多線程

這是我的代碼

#!/bin/bash 
cat data.txt | while read line 
do 
    echo 'scrape: '$line 
    php index.php $line >> output.csv 
done 

我怎麼能同時運行,就是每運行10線程。

+3

慶典並沒有真正有線程,但你可以通過把'&'在該行的結束在後臺運行進程,或者你可以看看一個工具,如[GNU parallel](https://www.gnu.org/software/parallel/) –

+1

你真的在推動bash的極限。如果使用像python或ruby這樣的適當腳本語言,你會有更多*更容易的時間 – Alexander

回答

3

您可以輕鬆地從sem GNU平行做到這一點:

#!/bin/bash 
cat data.txt | while read line 
do 
    echo 'scrape: '$line 
    sem -j 10 php index.php $line >> output.csv 
done 

然而,這是由你來確保並行寫入同一個文件時,輸出有意義。您可能想寫入不同的文件並在之後加入。

+0

如何寫入每個線程的不同文件? –

+0

將'output.csv'更改爲'output $((i ++))'。csv' –

1

雖然那個人的回答是正確的,但sem很慢(每個作業300毫秒),並且在這種情況下,它可以被一次調用GNU並行(在啓動時需要大約300毫秒和10毫秒每個作業):

parallel -j10 "echo scrape: {}; php index.php {}" :::: data.txt > output.csv 

對於每個作業一個文件:

parallel -j10 "(echo scrape: {}; php index.php {}) > output{#}.csv" :::: data.txt