溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux下怎么安裝和使用Parallel

發(fā)布時(shí)間:2022-02-11 09:59:49 來(lái)源:億速云 閱讀:777 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“Linux下怎么安裝和使用Parallel”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Linux下怎么安裝和使用Parallel”文章能幫助大家解決問(wèn)題。

Parallel Python是Python進(jìn)行分布式計(jì)算的開(kāi)源模塊,能夠?qū)⒂?jì)算壓力分布到多核CPU或集群的多臺(tái)計(jì)算機(jī)上,能夠非常方便的在內(nèi)網(wǎng)中搭建一個(gè)自組織的分布式計(jì)算平臺(tái)。

Linux下怎么安裝和使用Parallel

安裝 GNU Parallel

GNU Parallel 很可能沒(méi)有預(yù)裝在你的 Linux 或 BSD 主機(jī)上,你可以從軟件源中安裝。以 Fedora 為例:

$ sudo dnf install parallel

對(duì)于 NetBSD:

# pkg_add parallel

如果各種方式都不成功,請(qǐng)參考項(xiàng)目主頁(yè)[1]。

從串行到并行

正如其名稱所示,Parallel 的強(qiáng)大之處是以并行方式執(zhí)行任務(wù);而我們中不少人平時(shí)仍然以串行方式運(yùn)行任務(wù)。

當(dāng)你對(duì)多個(gè)對(duì)象執(zhí)行某個(gè)命令時(shí),你實(shí)際上創(chuàng)建了一個(gè)任務(wù)隊(duì)列。一部分對(duì)象可以被命令處理,剩余的對(duì)象需要等待,直到命令處理它們。這種方式是低效的。只要數(shù)據(jù)夠多,總會(huì)形成任務(wù)隊(duì)列;但與其只使用一個(gè)任務(wù)隊(duì)列,為何不使用多個(gè)更小規(guī)模的任務(wù)隊(duì)列呢?

假設(shè)你有一個(gè)圖片目錄,你希望將目錄中的圖片從 JEEG 格式轉(zhuǎn)換為 PNG 格式。有多種方法可以完成這個(gè)任務(wù)??梢允謩?dòng)用 GIMP 打開(kāi)每個(gè)圖片,輸出成新格式,但這基本是最差的選擇,費(fèi)時(shí)費(fèi)力。

上述方法有一個(gè)漂亮且簡(jiǎn)潔的變種,即基于 shell 的方案:

$ convert 001.jpeg 001.png
$ convert 002.jpeg 002.png
$ convert 003.jpeg 003.png
... 略 ...

對(duì)于初學(xué)者而言,這是一個(gè)不小的轉(zhuǎn)變,而且看起來(lái)是個(gè)不小的改進(jìn)。不再需要圖像界面和不斷的鼠標(biāo)點(diǎn)擊,但仍然是費(fèi)力的。

進(jìn)一步改進(jìn):

$ for i in *jpeg; do convert $i $i.png ; done

至少,這一步設(shè)置好任務(wù)執(zhí)行,讓你節(jié)省時(shí)間去做更有價(jià)值的事情。但問(wèn)題來(lái)了,這仍然是串行操作;一張圖片轉(zhuǎn)換完成后,隊(duì)列中的下一張進(jìn)行轉(zhuǎn)換,依此類推直到全部完成。

使用 Parallel:

$ find . -name "*jpeg" | parallel -I% --max-args 1 convert % %.png

這是兩條命令的組合:find 命令,用于收集需要操作的對(duì)象;parallel 命令,用于對(duì)象排序并確保每個(gè)對(duì)象按需處理。

  • find . -name “*jpeg” 查找當(dāng)前目錄下以 jpeg 結(jié)尾的所有文件。
  • parallel 調(diào)用 GNU Parallel。
  • -I% 創(chuàng)建了一個(gè)占位符 %,代表 find 傳遞給 Parallel 的內(nèi)容。如果不使用占位符,你需要對(duì) find 命令的每一個(gè)結(jié)果手動(dòng)編寫(xiě)一個(gè)命令,而這恰恰是你想要避免的。
  • –max-args 1 給出 Parallel 從隊(duì)列獲取新對(duì)象的速率限制??紤]到 Parallel 運(yùn)行的命令只需要一個(gè)文件輸入,這里將速率限制設(shè)置為 1。假如你需要執(zhí)行更復(fù)雜的命令,需要兩個(gè)文件輸入(例如 cat 001.txt 002.txt > new.txt),你需要將速率限制設(shè)置為 2。
  • convert % %.png 是你希望 Parallel 執(zhí)行的命令。

組合命令的執(zhí)行效果如下:find 命令收集所有相關(guān)的文件信息并傳遞給 parallel,后者(使用當(dāng)前參數(shù))啟動(dòng)一個(gè)任務(wù),(無(wú)需等待任務(wù)完成)立即獲取參數(shù)行中的下一個(gè)參數(shù)(LCTT 譯注:管道輸出的每一行對(duì)應(yīng) parallel 的一個(gè)參數(shù),所有參數(shù)構(gòu)成參數(shù)行);只要你的主機(jī)沒(méi)有癱瘓,Parallel 會(huì)不斷做這樣的操作。舊任務(wù)完成后,Parallel 會(huì)為分配新任務(wù),直到所有數(shù)據(jù)都處理完成。不使用 Parallel 完成任務(wù)大約需要 10 分鐘,使用后僅需 3 至 5 分鐘。

多個(gè)輸入

只要你熟悉 find 和 xargs (整體被稱為 GNU 查找工具,或 findutils),find 命令是一個(gè)完美的 Parallel 數(shù)據(jù)提供者。它提供了靈活的接口,大多數(shù) Linux 用戶已經(jīng)很習(xí)慣使用,即使對(duì)于初學(xué)者也很容易學(xué)習(xí)。

find 命令十分直截了當(dāng):你向 find 提供搜索路徑和待查找文件的一部分信息??梢允褂猛ㄅ浞瓿赡:阉?;在下面的例子中,星號(hào)匹配任何字符,故 find 定位(文件名)以字符 searchterm 結(jié)尾的全部文件:

$ find /path/to/directory -name "*searchterm"

默認(rèn)情況下,find 逐行返回搜索結(jié)果,每個(gè)結(jié)果對(duì)應(yīng) 1 行:

$ find ~/graphics -name "*jpg"/home/seth/graphics/001.jpg
/home/seth/graphics/cat.jpg
/home/seth/graphics/penguin.jpg
/home/seth/graphics/IMG_0135.jpg

當(dāng)使用管道將 find 的結(jié)果傳遞給 parallel 時(shí),每一行中的文件路徑被視為 parallel 命令的一個(gè)參數(shù)。另一方面,如果你需要使用命令處理多個(gè)參數(shù),你可以改變隊(duì)列數(shù)據(jù)傳遞給 parallel 的方式。

下面先給出一個(gè)不那么實(shí)際的例子,后續(xù)會(huì)做一些修改使其更加有意義。如果你安裝了 GNU Parallel,你可以跟著這個(gè)例子操作。

假設(shè)你有 4 個(gè)文件,按照每行一個(gè)文件的方式列出,具體如下:

$ echo ada > ada ; echo lovelace > lovelace
$ echo richard > richard ; echo stallman > stallman
$ ls -1
ada
lovelace
richard
stallman

你需要將兩個(gè)文件合并成第三個(gè)文件,后者同時(shí)包含前兩個(gè)文件的內(nèi)容。這種情況下,Parallel 需要訪問(wèn)兩個(gè)文件,使用 -I% 變量的方式不符合本例的預(yù)期。

Parallel 默認(rèn)情況下讀取 1 個(gè)隊(duì)列對(duì)象:

$ ls -1 | parallel echoada
lovelace
richard
stallman

現(xiàn)在讓 Parallel 每個(gè)任務(wù)使用 2 個(gè)隊(duì)列對(duì)象:

$ ls -1 | parallel --max-args=2 echoada lovelace
richard stallman

現(xiàn)在,我們看到行已經(jīng)并合并;具體而言,ls -1 的兩個(gè)查詢結(jié)果會(huì)被同時(shí)傳送給 Parallel。傳送給 Parallel 的參數(shù)涉及了任務(wù)所需的 2 個(gè)文件,但目前還只是 1 個(gè)有效參數(shù):(對(duì)于兩個(gè)任務(wù)分別為)“ada lovelace” 和 “richard stallman”。你真正需要的是每個(gè)任務(wù)對(duì)應(yīng) 2 個(gè)獨(dú)立的參數(shù)。

值得慶幸的是,Parallel 本身提供了上述所需的解析功能。如果你將 –max-args 設(shè)置為 2,那么 {1}和 {2} 這兩個(gè)變量分別代表傳入?yún)?shù)的第一和第二部分:

$ ls -1 | parallel --max-args=2 cat {1} {2} ">" {1}_{2}.person

在上面的命令中,變量 {1} 值為 ada 或 richard (取決于你選取的任務(wù)),變量 {2} 值為 lovelace 或 stallman。通過(guò)使用重定向符號(hào)(放到引號(hào)中,防止被 Bash 識(shí)別,以便 Parallel 使用),(兩個(gè))文件的內(nèi)容被分別重定向至新文件 ada_lovelace.person 和 richard_stallman.person。

$ ls -1
ada
ada_lovelace.person
lovelace
richard
richard_stallman.person
stallman

$ cat ada_*person
ada lovelace
$ cat ri*person
richard stallman

如果你整天處理大量幾百 MB 大小的日志文件,那么(上述)并行處理文本的方法對(duì)你幫忙很大;否則,上述例子只是個(gè)用于上手的示例。

然而,這種處理方法對(duì)于很多文本處理之外的操作也有很大幫助。下面是來(lái)自電影產(chǎn)業(yè)的真實(shí)案例,其中需要將一個(gè)目錄中的視頻文件和(對(duì)應(yīng)的)音頻文件進(jìn)行合并。

$ ls -1
12_LS_establishing-manor.avi
12_wildsound.flac
14_butler-dialogue-mixed.flac
14_MS_butler.avi
...略...

使用同樣的方法,使用下面這個(gè)簡(jiǎn)單命令即可并行地合并文件:

$ ls -1 | parallel --max-args=2 ffmpeg -i {1} -i {2} -vcodec copy -acodec copy {1}.mkv

簡(jiǎn)單粗暴的方式

上述花哨的輸入輸出處理不一定對(duì)所有人的口味。如果你希望更直接一些,可以將一堆命令甩給 Parallel,然后去干些其它事情。

首先,需要?jiǎng)?chuàng)建一個(gè)文本文件,每行包含一個(gè)命令:

$ cat jobs2run
bzip2 oldstuff.tar
oggenc music.flac
opusenc ambiance.wav
convert bigfile.tiff small.jpeg
ffmepg -i foo.avi -v:b 12000k foo.mp4
xsltproc --output build/tmp.fo style/dm.xsl src/tmp.xml
bzip2 archive.tar

接著,將文件傳遞給 Parallel:

$ parallel --jobs 6

現(xiàn)在文件中對(duì)應(yīng)的全部任務(wù)都在被 Parallel 執(zhí)行。如果任務(wù)數(shù)量超過(guò)允許的數(shù)目(LCTT 譯注:應(yīng)該是 –jobs 指定的數(shù)目或默認(rèn)值),Parallel 會(huì)創(chuàng)建并維護(hù)一個(gè)隊(duì)列,直到任務(wù)全部完成。

關(guān)于“Linux下怎么安裝和使用Parallel”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI