python 多进程绑定端口_Python教程之创建多进程
點上面“東哥IT筆記”,關注并星標
每天一篇業界最新技術分享
現在很多CPU都支持多核,甚至是手機都已經開始支持多核了。而Python的GIL(Global Interpreter Locko)則使得其沒法使用這些多核帶來的優勢。還好從Python2.6開始,引入了multiprocessing模塊,我們終于可以使用多核帶來的便利了。
本文,你會學習到下面這些內容:
使用多進程的優點
使用多進程的缺點
使用multiprocessing來創建多進程
Process的子類化
創建進程池
本文并不是一個multiprocessing的全面的介紹,假如你想全面的了解他,可以參見官方的文檔:
https://docs.python.org/2/library/multiprocessing.html
下面讓我們開始吧!
使用多進程的優點
使用多進程有很多優點:
多進程使用獨立的內存空間
相比于線程,代碼更加直觀
能夠使用多個CPU/多核
避免GIL
子進程可以被kill(和thread不同)
multiprocessing有和threading.Thread類似的接口
對CPU綁定的進程比較好(加密,二進制搜索,矩陣乘法等)
下面我們來看看使用多進程有什么缺點:
使用多進程的缺點
使用多進程也有一些缺點:
進程間通信更加復雜
內存的占用大于線程
使用multiprocessing來創建進程
multiprocessing是用來模擬threading.Thread類工作的。下面就是一個使用它的例子:
import multiprocessingimport randomimport timedef 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函數,你可以試試,看看你自己的輸出。
Process的子類化
multiporcessing模塊中的Process類是可以子類化的,他和threading.thread的類差不多。我們來看下面代碼:
# worker_thread_subclass.pyimport randomimport multiprocessingimport timeclass 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 randomimport timefrom multiprocessing import Pooldef 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
這個代碼的具體輸出如下所示:
總結
好了,現在你已經學會了如何使用mhltiprocessing模塊的相關內容了,希望你會喜歡這篇文章。
總結
以上是生活随笔為你收集整理的python 多进程绑定端口_Python教程之创建多进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oss可用性_对象存储OSS详解
- 下一篇: 浏览器渲染机制面试_浏览器渲染原理