多核心 CLI 命令問題

多核心 CLI 命令問題

我有 150 個 CLI 指令的集合要在我的 12 核心機器上的一個檔案中執行。在後台運行所有 150 個任務會使系統陷入困境,根據經驗,我發現運行 12-18 個任務是最佳的。

過去,我只是使用 split 命令將 150 個命令分割成 12 或 13 塊批次文件,然後運行每一個。然而,有些批次文件先於其他批次文件完成,最終我得到了3 或4 個批次文件,比其他批次文件花費了更長的時間才能完成,而其他9 或8 個核心則處於空閒狀態。

我的目標是保持所有 12 個核心運行,直到執行完所有 150 個 CLI 命令。

是否可以讓每個處理器從150 個CLI 命令列表中抓取一個任務,將該命令標記為正在執行,並讓其他11 個處理器抓取自己的項目,直到所有150 個處理器都完成,而處理器不會互相絆倒並抓取相同的 CLI 命令?寫入的文件必須是唯一的。

有什麼簡單的方法可以做到這一點嗎?

答案1

使用 GNU Parallel 看起來像這樣:

cat 150commands.txt | parallel

每個核心將執行一項作業。

GNU Parallel 是一個通用並行器,可以輕鬆地在同一台電腦或多台您可以透過 ssh 存取的電腦上並行運行作業。它通常可以代替for循環。

如果您想要在 4 個 CPU 上執行 32 個不同的作業,則並行化的直接方法是在每個 CPU 上執行 8 個作業:

簡單的調度

相反,GNU Parallel 在完成後會產生一個新進程 - 保持 CPU 處於活動狀態,從而節省時間:

GNU 平行調度

安裝

如果您的發行版未打包 GNU Parallel,您可以進行個人安裝,不需要 root 存取權。這樣做可以在 10 秒內完成:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

其他安裝選項,請參閱http://git.savannah.gnu.org/cgit/parallel.git/tree/README

了解更多

查看更多範例:http://www.gnu.org/software/parallel/man.html

觀看介紹影片:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

瀏覽本教學:http://www.gnu.org/software/parallel/parallel_tutorial.html

註冊電子郵件清單以獲得支援:https://lists.gnu.org/mailman/listinfo/parallel

相關內容