Bash
使用 xargs 和 cat 並行執行腳本
我在數據庫中插入了很多 CSV 文件。我想並行執行,例如執行 4 個程序。現在我用這樣的腳本來做:
find . -name "*.csv" | xargs -n 1 -P 4 ./run.sh
並將
run.sh
文件儲存到數據庫:cat "$1" | db-client "INSERT INTO ..."
看起來它有效,但我的問題是:cat 不會混淆來自 4 個程序的輸入,它真的是並行執行還是等到另一個程序完成
cat
?
- 除非您使用with和with ,否則永遠不要
find
輸入管道;否則,帶有空格或換行符的文件名將結束。xargs``-print0``find``-0``xargs
- 不是用於 的案例
cat "$1" | …
,而只是用於… < $1
. 可以寫得更緊湊,但隨你喜歡。- 不,
cat
不會“混淆”任何東西,因為沒有一個cat
程序,而是 4 個程序,具有完全隔離的參數列表和輸出。- 是的,它確實是並行執行的。
- 當然,您
db-client
也可以並行執行多次,但是數據庫系統的全部意義在於它使事情保持一致,因此,除非您將INSERT
語句設計為多條語句而不是原子語句,否則這是安全的。- 並行性在這裡根本沒有幫助。您的 CSV 文件訪問和數據庫寫入訪問都不受 CPU 的限制,而是受其下固有的序列化 IO 限制;所以,你在這裡並沒有真正解決問題。由於插入是一種寫入操作,並且必須與其他並發寫入同步,因此並行化可能會使事情變得更慢,而不是更快,除非您真的知道您的數據庫允許分片寫入,並且進入數據庫伺服器的頻寬比您的儲存讀取頻寬更寬- 嗯,考慮到你的問題,這不太可能。