python 多进程绑定端口_Python教程之创建多进程
點(diǎn)上面“東哥IT筆記”,關(guān)注并星標(biāo)
每天一篇業(yè)界最新技術(shù)分享
現(xiàn)在很多CPU都支持多核,甚至是手機(jī)都已經(jīng)開始支持多核了。而Python的GIL(Global Interpreter Locko)則使得其沒法使用這些多核帶來的優(yōu)勢(shì)。還好從Python2.6開始,引入了multiprocessing模塊,我們終于可以使用多核帶來的便利了。
本文,你會(huì)學(xué)習(xí)到下面這些內(nèi)容:
使用多進(jìn)程的優(yōu)點(diǎn)
使用多進(jìn)程的缺點(diǎn)
使用multiprocessing來創(chuàng)建多進(jìn)程
Process的子類化
創(chuàng)建進(jìn)程池
本文并不是一個(gè)multiprocessing的全面的介紹,假如你想全面的了解他,可以參見官方的文檔:
https://docs.python.org/2/library/multiprocessing.html
下面讓我們開始吧!
使用多進(jìn)程的優(yōu)點(diǎn)
使用多進(jìn)程有很多優(yōu)點(diǎn):
多進(jìn)程使用獨(dú)立的內(nèi)存空間
相比于線程,代碼更加直觀
能夠使用多個(gè)CPU/多核
避免GIL
子進(jìn)程可以被kill(和thread不同)
multiprocessing有和threading.Thread類似的接口
對(duì)CPU綁定的進(jìn)程比較好(加密,二進(jìn)制搜索,矩陣乘法等)
下面我們來看看使用多進(jìn)程有什么缺點(diǎn):
使用多進(jìn)程的缺點(diǎn)
使用多進(jìn)程也有一些缺點(diǎn):
進(jìn)程間通信更加復(fù)雜
內(nèi)存的占用大于線程
使用multiprocessing來創(chuàng)建進(jìn)程
multiprocessing是用來模擬threading.Thread類工作的。下面就是一個(gè)使用它的例子:
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模塊,另外兩個(gè)import分別是為random和time服務(wù)的。
worker函數(shù)就是用來假裝做一些事情,傳入一個(gè)name的參數(shù),沒有什么返回,他首先打印name的值,然后隨機(jī)sleep一段時(shí)間用來模擬做一段很長(zhǎng)時(shí)間的工作,最后打印work finish。
緊接著,你使用multiprocessing.Process創(chuàng)建了5個(gè)進(jìn)程,他的使用和threading.Tread()比較類似,你告訴Process哪個(gè)目標(biāo)函數(shù)需要調(diào)用,以及會(huì)傳入什么參數(shù)給他們,然后你調(diào)用了start函數(shù)來啟動(dòng)進(jìn)程。另外你會(huì)把這些進(jìn)程加入到一個(gè)list中。
最后,你遍歷這個(gè)list,調(diào)用join方法,這個(gè)方法其實(shí)就是告訴Python等到進(jìn)程結(jié)束。
假如你run這個(gè)函數(shù),你會(huì)看到類似下面這樣的輸出:
其實(shí)你每次運(yùn)行這個(gè)函數(shù),結(jié)果都會(huì)有稍許的不同,主要還是因?yàn)槟阏{(diào)用了random函數(shù),你可以試試,看看你自己的輸出。
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()這里,我們寫了一個(gè)multiprocess.Process()的子類,并且重寫了run()方法。
其他方面和上面的例子其實(shí)是類似的,現(xiàn)在我們可以來看看具體的輸出,和上面的也類似。
創(chuàng)建一個(gè)進(jìn)程池
假如你有很多進(jìn)程需要運(yùn)行,有時(shí)你希望能夠限制進(jìn)程運(yùn)行的數(shù)目。比如說,你需要運(yùn)行20個(gè)進(jìn)程,但是你只有4個(gè)核,那么你可以使用multiprocessing模塊來創(chuàng)建一個(gè)進(jìn)程池,用它來限制每次進(jìn)程運(yùn)行的數(shù)目到4個(gè)。
下面是示例的代碼:
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()這個(gè)例子中,worker函數(shù)還是一樣的,主要是后面的代碼, 我們創(chuàng)建了一個(gè)進(jìn)程池,他的數(shù)目是5,也就意味著最大的運(yùn)行數(shù)目是5。使用這個(gè)pool,你需要調(diào)用map()方法,然后把你需要的調(diào)用的方法和參數(shù)傳遞給他。
這樣的話,Python每次只會(huì)使用5個(gè)進(jìn)程來運(yùn)行直到結(jié)束。最后你需要調(diào)用terminate()函數(shù),否則你會(huì)發(fā)現(xiàn)下面的錯(cuò)誤:
/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
這個(gè)代碼的具體輸出如下所示:
總結(jié)
好了,現(xiàn)在你已經(jīng)學(xué)會(huì)了如何使用mhltiprocessing模塊的相關(guān)內(nèi)容了,希望你會(huì)喜歡這篇文章。
總結(jié)
以上是生活随笔為你收集整理的python 多进程绑定端口_Python教程之创建多进程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oss可用性_对象存储OSS详解
- 下一篇: 浏览器渲染机制面试_浏览器渲染原理