Perl多進(jìn)程及其和多線程的關(guān)系解析
本文向大家介紹一下Perl多進(jìn)程的用法和適用場(chǎng)景,以及Perl多進(jìn)程和多線程的關(guān)系。在IT產(chǎn)品系統(tǒng)測(cè)試的自動(dòng)化項(xiàng)目中,經(jīng)常有并行處理多個(gè)子任務(wù)的需求,為了提高測(cè)試效率,就需要用到Perl多進(jìn)程或者多線程編程。
Perl多進(jìn)程技術(shù)在自動(dòng)化測(cè)試中的應(yīng)用
在IT產(chǎn)品系統(tǒng)測(cè)試的自動(dòng)化項(xiàng)目中,經(jīng)常有并行處理多個(gè)子任務(wù)的需求,為了提高測(cè)試效率,就需要用到Perl多進(jìn)程或者多線程編程。文章介紹了Perl多進(jìn)程的用法和適用場(chǎng)景,以及Perl多進(jìn)程和多線程的關(guān)系。同時(shí)結(jié)合企業(yè)級(jí)IT產(chǎn)品系統(tǒng)測(cè)試的自動(dòng)化特點(diǎn),介紹了Perl多進(jìn)程在這方面的應(yīng)用。
Perl多進(jìn)程
Perl語(yǔ)言是一種非常強(qiáng)大的腳本語(yǔ)言,其廣泛應(yīng)用于系統(tǒng)維護(hù),CGI(CommonGatewayInterface)編程,數(shù)據(jù)庫(kù)編程和自動(dòng)化測(cè)試中。
多任務(wù)和并發(fā)處理一度被看作是判定優(yōu)異操作系統(tǒng)的一個(gè)特性;同樣任何優(yōu)秀從而流行的編程語(yǔ)言都會(huì)有并發(fā)的應(yīng)用,而且都有各自的實(shí)現(xiàn)方法。Perl最開(kāi)始在并發(fā)方面的應(yīng)用就是Perl多進(jìn)程。
Perl多進(jìn)程的用戶接口是fork()函數(shù)以及對(duì)系統(tǒng)fork函數(shù)封裝的一些module。我們?cè)谑褂肞erl語(yǔ)言編程時(shí),如果一個(gè)任務(wù)的某一個(gè)段可以或者需要并發(fā)很多執(zhí)行,那么我們就會(huì)使用Perl多進(jìn)程編程,例如同時(shí)向數(shù)據(jù)庫(kù)遞交多個(gè)記錄的查詢,同時(shí)完成多個(gè)系統(tǒng)信息的收集等等。
Perl的Perl多進(jìn)程是這樣實(shí)現(xiàn)的:主進(jìn)程每fork一個(gè)子進(jìn)程,會(huì)把當(dāng)前(主進(jìn)程的)內(nèi)存空間的所有變量都復(fù)制一份傳到新的進(jìn)程里面,達(dá)到數(shù)據(jù)共享的目的。此外,主進(jìn)程和子進(jìn)程可以通過(guò)信號(hào)、管道等來(lái)通信。
在處理并發(fā)的方案中,Perl多進(jìn)程依靠?jī)?nèi)存空間獨(dú)享提供了優(yōu)秀的容錯(cuò)性和健壯性。一個(gè)Perl多進(jìn)程的系統(tǒng)不會(huì)由于其中一個(gè)進(jìn)程的狀態(tài)不良而崩潰,每個(gè)進(jìn)程都相對(duì)獨(dú)立地運(yùn)作,很少會(huì)相互影響。
內(nèi)存空間獨(dú)享也造就了Perl多進(jìn)程不可避免的劣勢(shì):資源負(fù)荷以及通信復(fù)雜,對(duì)于Perl來(lái)說(shuō),每個(gè)子進(jìn)程都可以看作主進(jìn)程的拷貝,這多少有些內(nèi)存浪費(fèi),而且主進(jìn)程的關(guān)鍵變量如果是“淺復(fù)制”到子進(jìn)程的話,將會(huì)帶來(lái)一些意想不到的錯(cuò)誤。另外,進(jìn)程的創(chuàng)建和回收會(huì)帶來(lái)許多額外的負(fù)載,因此應(yīng)當(dāng)盡量避免頻繁地創(chuàng)建進(jìn)程。
Perl多進(jìn)程之間的通信方式有socket,管道,信號(hào)量等。在Linux平臺(tái)上,對(duì)于進(jìn)程間大量信息的交互情況,最常用的是文件;這在用戶空間進(jìn)程和系統(tǒng)內(nèi)核空間進(jìn)程之間的通信中的最為常用。
在談起Perl多進(jìn)程的時(shí)候,不可避免的要說(shuō)說(shuō)它與Perl多線程的關(guān)系。
Perl多進(jìn)程和多線程的關(guān)系
如果我們需要執(zhí)行一些各異的小任務(wù),他們可能數(shù)量較多,但生存周期都比較短,或者他們可能共享大量數(shù)據(jù),只有小部分的變量是自身的。這個(gè)時(shí)候,很自然就想到了多線程。
從Perl5.005開(kāi)始,多線程的概念被引入Perl語(yǔ)言了;不過(guò)僅僅是概念而已。在Perl5.005中,線程模型默認(rèn)共享所有的數(shù)據(jù),而且數(shù)據(jù)的共享訪問(wèn)需要明確的同步操作。這個(gè)模型被稱為“5005threads”,其實(shí)就是Perl多進(jìn)程,只不過(guò)換了個(gè)“多線程”的概念。
到了Perl5.6,一個(gè)新的線程模型引入了,各個(gè)線程的數(shù)據(jù)默認(rèn)是私有的,而且共享數(shù)據(jù)的訪問(wèn)需要顯式地調(diào)用相關(guān)的函數(shù)來(lái)保證同步。這個(gè)模型稱為“ithreads”。在Perl5.6中,ithreads模型并沒(méi)有提供一些API供用戶調(diào)用,僅作為一個(gè)內(nèi)部的API供擴(kuò)展使用。
到了Perl5.8,ithreads模型通過(guò)Perl的threads模塊供用戶使用,但是Perl5.8同時(shí)也保留了5005threads模型。這里,用戶可以通過(guò)配置來(lái)選擇使用哪一種模型。
對(duì)于***的Perl5.10,5005threads模型就不再使用了,已從Perl解釋器中移除了。所以要使用真正意義的、穩(wěn)定的多線程模塊,建議使用Perl5.10解釋器。2009年3月release的SLES11的安裝包已經(jīng)默認(rèn)使用Perl5.10了。至此,Perl多進(jìn)程和多線程應(yīng)該是區(qū)別開(kāi)來(lái)了。
Perl的threads模塊提供的多線程,應(yīng)用于我們經(jīng)典的多線程編程例如SocketServer編程、硬件驅(qū)動(dòng)或者適配層編程十分有效,然而對(duì)于非線程安全的一些函數(shù)或者模塊調(diào)用就無(wú)能為力了,會(huì)導(dǎo)致不可預(yù)知的錯(cuò)誤或者主進(jìn)程的吊死、崩潰。
【編輯推薦】