十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
最近,有一批任務(wù)需要把兩批的fastq合并到一起并壓縮成一個(gè)fastq文件才能繼續(xù)往下做,由于存儲(chǔ)空間有限又不能直接全部跑上,只能按樣本逐個(gè)分批跑。眾所周知,一般fastq是成對(duì)存在的,所需要對(duì)read1和read2分別合并一次,然而這次任務(wù)的fastq文件比較大,合并然后壓縮一次需要1天左右,那對(duì)于一組fastq就要2-3天,這也太耗時(shí)間了,所以我在想能不能read1和read2 同時(shí)跑上,這就可以節(jié)省一半的時(shí)間了。
創(chuàng)新互聯(lián)建站從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元白沙黎族做網(wǎng)站,已為上家服務(wù),為白沙黎族各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
平時(shí)也能遇到很多類似的任務(wù),特別是在進(jìn)程數(shù)有限的情況下,如果這些小任務(wù)單獨(dú)占用一個(gè)進(jìn)程,而任務(wù)很多就很耗時(shí)間,如果能在一個(gè)進(jìn)程下實(shí)現(xiàn)多個(gè)線程并行執(zhí)行,就能大大提高運(yùn)行效率。關(guān)于進(jìn)程和線程的知識(shí)可以參考知乎的這篇文章【 Shell“ 多線程”,提高工作效率 】,整理的也比較有條理,能比較容易讀懂。
當(dāng)然,某些博主也寫過類似的文章,例如這篇【 shell后臺(tái)限制多并發(fā)控制后臺(tái)任務(wù)強(qiáng)度進(jìn)行文件拷貝 】但是實(shí)在是太高深莫測(cè)了,看不懂,一時(shí)半會(huì)兒也學(xué)不會(huì)。本文將示例Shell實(shí)現(xiàn)多線程的簡(jiǎn)單版本,其實(shí)不用太復(fù)雜。
其實(shí)只需要兩個(gè)步驟, 第一步是給需要并行運(yùn)行的命令行在結(jié)尾加上"",代表放到后臺(tái)運(yùn)行,第二步是在在所有并行任務(wù)的后面加上一句“wait”,意思是等所有通過“”放到后臺(tái)運(yùn)行的任務(wù)跑完后再繼續(xù)執(zhí)行后面的任務(wù) ,這些就能實(shí)現(xiàn)所有帶有“”的行并行執(zhí)行了。
看完腳本是不是覺得很簡(jiǎn)單?
上面的腳本適合并行任務(wù)少的,可以手動(dòng)加和wait,但是如果有幾十個(gè)甚至上百個(gè)的小任務(wù)就比較麻煩了。但不用擔(dān)心,可以寫個(gè)循環(huán),批量運(yùn)行。
循環(huán)的結(jié)果也是跟上面類似的,只是多了個(gè)循環(huán)結(jié)構(gòu)。
如果需要執(zhí)行的任務(wù)只有一行,可以把大括號(hào)去掉。
關(guān)于for和while的循環(huán)可以查看之前的文章【 Shell常用循環(huán)示例(for和while批量處理)2022-05-25 】
需要注意的是多線程并行還是需要有限制的,畢竟都是在一個(gè)進(jìn)程里運(yùn)行,如果線程太多了會(huì)卡頓的,建議控制在100個(gè)以內(nèi),當(dāng)然還有畢竟高級(jí)和復(fù)雜的方法可以實(shí)現(xiàn)限制。因?yàn)樯厦娴哪_本已經(jīng)夠我用了,沒繼續(xù)往下學(xué),以后可以再補(bǔ)充。
參考 60、騎白馬的不一定是王子,可能是唐僧;有翅膀的不一定是天使,也可能是鳥人!
linux也是有不同類型的,比如個(gè)人桌面版的只支持單處理器,而企業(yè)級(jí)服務(wù)器版的則支持多處理器。所以這個(gè)多任務(wù)在不同的版本上也是有不同的意思。在個(gè)人版上,也就是我們平常說的最多的多任務(wù)系統(tǒng),其實(shí)是多個(gè)任務(wù)排隊(duì)使用cpu,因?yàn)閏pu在同一時(shí)刻是只能被獨(dú)享的,這是絕對(duì)的。還有任務(wù)這個(gè)概念比較籠統(tǒng),只是相對(duì)于我們的需要來說,并不是從操作系統(tǒng)的角度出發(fā)的,對(duì)我們來說一個(gè)任務(wù)可能由很多步驟構(gòu)成,而這些步驟也是由或多或少的進(jìn)程構(gòu)成的,所以,一個(gè)任務(wù)就是由一個(gè)或者多個(gè)進(jìn)程構(gòu)成的處理序列。linux是一個(gè)多線程的操作系統(tǒng),而我們知道,進(jìn)程是計(jì)算機(jī)的最小資源分配單元,而線程則是最小的調(diào)度單元(這兩個(gè)概念請(qǐng)自行查找資料),也就是說,linux系統(tǒng)中真正使用cpu的是線程,當(dāng)然了,也有不需要?jiǎng)?chuàng)建線程的進(jìn)程?,F(xiàn)在的操作系統(tǒng)大部分都是分時(shí)的,這個(gè)概念只要學(xué)過計(jì)算機(jī)基礎(chǔ)的人都知道,也就是對(duì)每個(gè)進(jìn)程或者線程按照調(diào)度進(jìn)程的算法來調(diào)度他們使用cpu的先后順序和時(shí)間片長(zhǎng)度。
對(duì)于單處理器的系統(tǒng),每個(gè)cpu每次只允許有一個(gè)進(jìn)程或線程使用,整個(gè)系統(tǒng)中也只有這一個(gè)進(jìn)程或線程在運(yùn)行,而對(duì)于多處理器系統(tǒng)(如果硬件安裝了多處理器的話),每個(gè)cpu每次也只允許有一個(gè)進(jìn)程或線程使用,整個(gè)系統(tǒng)中允許有多個(gè)進(jìn)程或線程同時(shí)運(yùn)行,這種叫并行處理。請(qǐng)注意,這個(gè)我們?cè)赑C上同時(shí)開很多任務(wù)是不同的,這種是真正意義上的同時(shí)處理,是絕對(duì)的。