日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python 多进程绑定端口_Python教程之创建多进程

發(fā)布時(shí)間:2025/3/21 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 多进程绑定端口_Python教程之创建多进程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

點(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。