您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python中多進程有什么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
使用多進程有很多優點:
多進程使用獨立的內存空間
相比于線程,代碼更加直觀
能夠使用多個CPU/多核
避免GIL
子進程可以被kill(和thread不同)
multiprocessing有和threading.Thread類似的接口
對CPU綁定的進程比較好(加密,二進制搜索,矩陣乘法等)
下面我們來看看使用多進程有什么缺點:
使用多進程也有一些缺點:
進程間通信更加復雜
內存的占用大于線程
multiprocessing是用來模擬threading.Thread類工作的。下面就是一個使用它的例子:
import multiprocessing import random import time def worker(name: str) -> None: print(f'Started worker {name}') worker_time = random.choice(range(1, 5)) time.sleep(worker_time) print(f'{name} worker finished in {worker_time} seconds') if __name__ == '__main__': processes = [] for i in range(5): process = multiprocessing.Process(target=worker, args=(f'computer_{i}',)) processes.append(process) process.start() for proc in processes: proc.join()
首先第一步需要import multiprocessing模塊,另外兩個import分別是為random和time服務的。
worker函數就是用來假裝做一些事情,傳入一個name的參數,沒有什么返回,他首先打印name的值,然后隨機sleep一段時間用來模擬做一段很長時間的工作,最后打印work finish。
緊接著,你使用multiprocessing.Process創建了5個進程,他的使用和threading.Tread()比較類似,你告訴Process哪個目標函數需要調用,以及會傳入什么參數給他們,然后你調用了start函數來啟動進程。另外你會把這些進程加入到一個list中。
最后,你遍歷這個list,調用join方法,這個方法其實就是告訴Python等到進程結束。
假如你run這個函數,你會看到類似下面這樣的輸出:
其實你每次運行這個函數,結果都會有稍許的不同,主要還是因為你調用了random函數,你可以試試,看看你自己的輸出。
multiporcessing模塊中的Process類是可以子類化的,他和threading.thread的類差不多。我們來看下面代碼:
# worker_thread_subclass.py import random import multiprocessing import time class WorkerProcess(multiprocessing.Process): def __init__(self, name): multiprocessing.Process.__init__(self) self.name = name def run(self): """ Run the thread """ worker(self.name) def worker(name: str) -> None: print(f'Started worker {name}') worker_time = random.choice(range(1, 5)) time.sleep(worker_time) print(f'{name} worker finished in {worker_time} seconds') if __name__ == '__main__': processes = [] for i in range(5): process = WorkerProcess(name=f'computer_{i}') processes.append(process) process.start() for process in processes: process.join()
這里,我們寫了一個multiprocess.Process()的子類,并且重寫了run()方法。
其他方面和上面的例子其實是類似的,現在我們可以來看看具體的輸出,和上面的也類似。
假如你有很多進程需要運行,有時你希望能夠限制進程運行的數目。比如說,你需要運行20個進程,但是你只有4個核,那么你可以使用multiprocessing模塊來創建一個進程池,用它來限制每次進程運行的數目到4個。
下面是示例的代碼:
import random import time from multiprocessing import Pool def worker(name: str) -> None: print(f'Started worker {name}') worker_time = random.choice(range(1, 5)) time.sleep(worker_time) print(f'{name} worker finished in {worker_time} seconds') if __name__ == '__main__': process_names = [f'computer_{i}' for i in range(15)] pool = Pool(processes=5) pool.map(worker, process_names) pool.terminate()
這個例子中,worker函數還是一樣的,主要是后面的代碼, 我們創建了一個進程池,它的數目是5,也就意味著最大的運行數目是5。使用這個pool,你需要調用map()方法,然后把你需要的調用的方法和參數傳遞給他。
這樣的話,Python每次只會使用5個進程來運行直到結束。最后你需要調用terminate()函數,否則你會發現下面的錯誤:
/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/resource_tracker.py:216:
UserWarning: resource_tracker: There appear to be 6 leaked semaphore objects to clean up at shutdown
關于“Python中多進程有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。