溫馨提示×

溫馨提示×

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

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

Python標(biāo)準(zhǔn)庫的很多初步進(jìn)程是怎樣的

發(fā)布時間:2021-10-15 09:10:51 來源:億速云 閱讀:96 作者:柒染 欄目:編程語言

Python標(biāo)準(zhǔn)庫的很多初步進(jìn)程是怎樣的,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

  我們知道使用subprocess包來創(chuàng)建子進(jìn)程,但這個包是有兩個很大的局限性的:

  1)我們總是讓subprocess運(yùn)行外部的程序,而不是運(yùn)行一個Python腳本內(nèi)部編寫的函數(shù)。

  2)進(jìn)程間只通過管道進(jìn)行文本交流。以上限制了我們將subprocess包應(yīng)用到更廣泛的多進(jìn)程任務(wù)。(這樣的比較實(shí)際是不公平的,因?yàn)閟ubprocessing本身就是設(shè)計(jì)成為一個shell,而不是一個多進(jìn)程管理包)

threading和multiprocessing

  multiprocessing包是Python中的多進(jìn)程管理包。與threading.Thread類似,它可以利用multiprocessing.Process對象來創(chuàng)建一個進(jìn)程。該進(jìn)程可以運(yùn)行在Python程序內(nèi)部編寫的函數(shù)。該P(yáng)rocess對象與Thread對象的用法相同,也有start(),run(),join()的方法。此外multiprocessing包中也有Lock/Event/Semaphore/Condition類(這些對象可以像多線程那樣,通過參數(shù)傳遞給各個進(jìn)程),用以同步進(jìn)程,其用法與threading包中的同名類一致。所以,multiprocessing的很大一部份與threading使用同一套API,只不過換到了多進(jìn)程的情境。

  但在使用這些共享API的時候,我們要注意以下幾點(diǎn):

  在UNIX平臺上,當(dāng)某個進(jìn)程終結(jié)之后,該進(jìn)程需要被其父進(jìn)程調(diào)用wait,否則進(jìn)程成為僵尸進(jìn)程(Zombie)。所以,有必要對每個Process對象調(diào)用join()方法(實(shí)際上等同于wait)。對于多線程來說,由于只有一個進(jìn)程,所以不存在此必要性。

  multiprocessing提供了threading包中沒有的IPC(比如Pipe和Queue),效率上更高。應(yīng)優(yōu)先考慮Pipe和Queue,避免使用Lock/Event/Semaphore/Condition等同步方式(因?yàn)樗鼈冋紦?jù)的不是用戶進(jìn)程的資源)。

  多進(jìn)程應(yīng)該避免共享資源。在多線程中,我們可以比較容易地共享資源,比如使用全局變量或者傳遞參數(shù)。在多進(jìn)程情況下,由于每個進(jìn)程有自己獨(dú)立的內(nèi)存空間,以上方法并不合適。此時我們可以通過共享內(nèi)存和Manager的方法來共享資源。但這樣做提高了程序的復(fù)雜度,并因?yàn)橥降男枰档土顺绦虻男省?/p>

Process.PID中保存有PID,如果進(jìn)程還沒有start(),則PID為None。

  我們可以從下面的程序中看到Thread對象和Process對象在使用上的相似性與結(jié)果上的不同。各個線程和進(jìn)程都做一件事:打印PID。但問題是,所有的任務(wù)在打印的時候都會向同一個標(biāo)準(zhǔn)輸出(stdout)輸出。這樣輸出的字符會混合在一起,無法閱讀。使用Lock同步,在一個任務(wù)輸出完成之后,再允許另一個任務(wù)輸出,可以避免多個任務(wù)同時向終端輸出。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

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

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

AI