小編給大家分享一下python多進(jìn)程共享變量的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的東豐網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!多進(jìn)程共享變量和獲得結(jié)果
由于工程需求,要使用多線程來跑一個程序。但是因為聽說python的多線程是假的,于是使用多進(jìn)程,反正任務(wù)需要共享的參數(shù)少。
查閱資料,發(fā)現(xiàn)實現(xiàn)多進(jìn)程主要使用Multiprocessing,有兩種方式,一種是Process,另一種是Pool。
p = Process(target=fun,args=(args))
再通過p.start()來啟動一個子進(jìn)程,通過p.join()方法來使得子進(jìn)程運(yùn)行結(jié)束后再執(zhí)行父進(jìn)程。
但是這樣很煩,還要寫個for 循環(huán)來開n個線程和join。
于是推薦用Pool。它可以開一個固定大小的進(jìn)程池,然后每個線程執(zhí)行apply_async()函數(shù)調(diào)用要執(zhí)行的函數(shù),最后再close和join。
代碼如下:
pathm=Manager().Queue(len(pathlist)) for d in pathlist: pathm.put(d) p=Pool(cp.threads) results=[] for i in range(cp.threads): temp=p.apply_async(ProcessWorker,args=(i,pathm,cp)) results.append(temp) print 'Waiting for all subprocesses done...' p.close() p.join() print 'All subprocesses finish Processing.' results=[r.get() for r in results]
上面的代碼演示了如何使用pool多進(jìn)程,如何在Pool里的進(jìn)程之間共享變量pathm,以及如何獲得進(jìn)程函數(shù)執(zhí)行的結(jié)果。需要注意的是,ProcessWorker必須是個無界的函數(shù),否則報錯該函數(shù)無法被pickle從而不能分配到各個進(jìn)程。
cPickle.PicklingError: Can't pickle: attribute lookup __builtin__.instancemethod failed
有界函數(shù)和python的多進(jìn)程機(jī)制
從上面引申到了一個概念,就是有界函數(shù)無界函數(shù)的概念。
查閱資料之后我總結(jié)如下:
有界函數(shù)是包在一個類中,并且只有當(dāng)類被實例化之后才能使用的函數(shù),它的界就是這個實例。我們常常把這些函數(shù)稱為類方法。例如以self為參數(shù)的類方法。
無界函數(shù)可以是沒有被包在類中的函數(shù),也可以是類中的靜態(tài)方法,它們跟類是獨立的。如類中的靜態(tài)方法,它即使在某個類中被定義,但是不能訪問類中的參數(shù)和其他方法。
python多進(jìn)程的機(jī)制應(yīng)該是把每個進(jìn)程要調(diào)用的方法和傳入的參數(shù)(如上面例子中的ProcessWorker)編譯然后打包,然后復(fù)制到每個進(jìn)程中執(zhí)行。如果輸入的是一個有界函數(shù),那么它的參數(shù)應(yīng)該是它所屬的類(包括參數(shù)和方法),但是這是無法獲得的,而且類屬性和方法可能會有坑,導(dǎo)致難以打包。所以python限定了多進(jìn)程要調(diào)用的函數(shù)不能是類方法。
我們要把多進(jìn)程調(diào)用的函數(shù)放到類外面,或者變成靜態(tài)函數(shù)。但是靜態(tài)函數(shù)的話不能被所屬的類的方法調(diào)用(self.ProcessWorker的形式),需要在外部調(diào)用,如mc=MyClass(),mc.ProcessWorker來調(diào)用,或者M(jìn)yClass().ProcessWorker來調(diào)用。
以上是“python多進(jìn)程共享變量的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。