您好,登錄后才能下訂單哦!
Python標準庫的很多初步進程是怎樣的,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
我們知道使用subprocess包來創建子進程,但這個包是有兩個很大的局限性的:
1)我們總是讓subprocess運行外部的程序,而不是運行一個Python腳本內部編寫的函數。
2)進程間只通過管道進行文本交流。以上限制了我們將subprocess包應用到更廣泛的多進程任務。(這樣的比較實際是不公平的,因為subprocessing本身就是設計成為一個shell,而不是一個多進程管理包)
multiprocessing包是Python中的多進程管理包。與threading.Thread類似,它可以利用multiprocessing.Process對象來創建一個進程。該進程可以運行在Python程序內部編寫的函數。該Process對象與Thread對象的用法相同,也有start(),run(),join()的方法。此外multiprocessing包中也有Lock/Event/Semaphore/Condition類(這些對象可以像多線程那樣,通過參數傳遞給各個進程),用以同步進程,其用法與threading包中的同名類一致。所以,multiprocessing的很大一部份與threading使用同一套API,只不過換到了多進程的情境。
但在使用這些共享API的時候,我們要注意以下幾點:
在UNIX平臺上,當某個進程終結之后,該進程需要被其父進程調用wait,否則進程成為僵尸進程(Zombie)。所以,有必要對每個Process對象調用join()方法(實際上等同于wait)。對于多線程來說,由于只有一個進程,所以不存在此必要性。
multiprocessing提供了threading包中沒有的IPC(比如Pipe和Queue),效率上更高。應優先考慮Pipe和Queue,避免使用Lock/Event/Semaphore/Condition等同步方式(因為它們占據的不是用戶進程的資源)。
多進程應該避免共享資源。在多線程中,我們可以比較容易地共享資源,比如使用全局變量或者傳遞參數。在多進程情況下,由于每個進程有自己獨立的內存空間,以上方法并不合適。此時我們可以通過共享內存和Manager的方法來共享資源。但這樣做提高了程序的復雜度,并因為同步的需要而降低了程序的效率。
我們可以從下面的程序中看到Thread對象和Process對象在使用上的相似性與結果上的不同。各個線程和進程都做一件事:打印PID。但問題是,所有的任務在打印的時候都會向同一個標準輸出(stdout)輸出。這樣輸出的字符會混合在一起,無法閱讀。使用Lock同步,在一個任務輸出完成之后,再允許另一個任務輸出,可以避免多個任務同時向終端輸出。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。