人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

Python多進(jìn)程的使用詳情

發(fā)布日期:2022-01-03 09:20 | 文章來源:源碼之家

一、進(jìn)程的創(chuàng)建

Pythonmultiprocessing模塊提供了Process類,該類可用來在各平臺(tái)下創(chuàng)建新進(jìn)程。其構(gòu)造函數(shù)是:

__init__(self, group=None, target=None, name=None, args=(), kwargs={})

其中,各個(gè)參數(shù)的含義如下:

  • group: 該參數(shù)未實(shí)現(xiàn),不需要傳參
  • target:為新建進(jìn)程指定執(zhí)行任務(wù),也就是指定一個(gè)函數(shù)
  • args:以元組的方式,為target指定的方法傳遞參數(shù),如果傳入的是元組中有多個(gè)參數(shù)的話則傳入方式是(arg1,arg2,....argn,)
  • kwargs:以字典的方法,為target指定的方法傳遞參數(shù)。
  • name: 為新建進(jìn)程設(shè)置名稱

1、一些常用方法介紹

start() 方法用于啟動(dòng)進(jìn)程
run() 方法用于運(yùn)行所要執(zhí)行的任務(wù)
is_alive() 方法用于判斷當(dāng)前進(jìn)程是否還活著
getPid() 方法用于獲取進(jìn)程的ID號(hào)。

直接創(chuàng)建Process類的實(shí)例對(duì)象,由此就可以創(chuàng)建一個(gè)新的進(jìn)程;

這個(gè)就類似于直接創(chuàng)建實(shí)例化線程Thread類

from multiprocessing import Process
import os
# 定義要調(diào)用的方法
def async_fun(name, add):
 for arc in add:
  print(name + str(os.getpid()) + " " + arc)
if __name__ == '__main__':
 my_tuple = ("碼農(nóng)飛哥", "今天是宅家的一天", "30歲了還沒對(duì)象焦慮呀")
 # 創(chuàng)建進(jìn)程
 process = Process(target=async_fun, args=("子進(jìn)程", my_tuple))
 # 啟動(dòng)子進(jìn)程
 process.start()
 # 啟動(dòng)主進(jìn)程
 async_fun("主進(jìn)程", my_tuple)

運(yùn)行結(jié)果是:

主進(jìn)程11610 碼農(nóng)飛哥
主進(jìn)程11610 今天是宅家的一天
主進(jìn)程11610 30歲了還沒對(duì)象焦慮呀
子進(jìn)程11612 碼農(nóng)飛哥
子進(jìn)程11612 今天是宅家的一天
子進(jìn)程11612 30歲了還沒對(duì)象焦慮呀

這里需要注意的一點(diǎn)是,必須要將代碼放在if __name__ == '__main__': 代碼塊中。通過os.getpid()方法來獲取進(jìn)程號(hào)。

通過繼承Process類的子類,創(chuàng)建實(shí)例對(duì)象,也可以創(chuàng)建新的進(jìn)程。

第二種方式就是通過繼承Process類的子類,創(chuàng)建實(shí)例對(duì)象,也可以創(chuàng)建新的進(jìn)程,不過這種方式需要重寫父類的run()方法。這種方法就類似于直接繼承Thread類創(chuàng)建線程。

import multiprocessing
import os

# 定義要調(diào)用的方法
def async_fun(name, add):
 for arc in add:
  print(name + str(os.getpid()) + " " + arc)

class MyProcess(multiprocessing.Process):
 def __init__(self, name, add):
  multiprocessing.Process.__init__(self)
  self.add = add
  self.name = name
  # 重寫run()方法
 def run(self):
  async_fun(self.name, self.add)

if __name__ == '__main__':
 my_tuple = ("碼農(nóng)飛哥", "今天是宅家的一天", "宅家也不能虛度")
 myprocess = MyProcess("子進(jìn)程", my_tuple)
 myprocess.start()
 # 主進(jìn)程
 async_fun("主進(jìn)程", my_tuple)

運(yùn)行結(jié)果同上:

主進(jìn)程11610 碼農(nóng)飛哥
主進(jìn)程11610 今天是宅家的一天
主進(jìn)程11610 30歲了還沒對(duì)象焦慮呀
子進(jìn)程11612 碼農(nóng)飛哥
子進(jìn)程11612 今天是宅家的一天
子進(jìn)程11612 30歲了還沒對(duì)象焦慮呀

這里還是推薦使用第一種方法創(chuàng)建進(jìn)程,因?yàn)檫@種方式創(chuàng)建進(jìn)程比較簡潔

二、進(jìn)程池的使用

由于創(chuàng)建進(jìn)程對(duì)系統(tǒng)的開銷比較大。所以,所以在實(shí)際開發(fā)中一般都會(huì)使用進(jìn)程池來創(chuàng)建進(jìn)程。進(jìn)程池的使用與線程池的使用也是有神似的地方。同樣的在multiprocessing模塊中提供了Pool函數(shù)來創(chuàng)建進(jìn)程池。

import os
from multiprocessing import Pool
import time

# 定義要調(diào)用的方法
def async_fun(add):
 time.sleep(1)
 print("進(jìn)程號(hào):" + str(os.getpid()) + " " + add)

if __name__ == '__main__':
 add = "碼農(nóng)飛哥,今天是宅家的一天,30歲了還沒對(duì)象焦慮呀"
 # 創(chuàng)建包含4個(gè)進(jìn)程的進(jìn)程池
 pool = Pool(processes=4)
 # 提交action
 pool.apply_async(func=async_fun, args=(add,))
 pool.apply_async(func=async_fun, args=("加油加油",))
 pool.close()
 pool.join()

運(yùn)行結(jié)果是:

進(jìn)程號(hào):11658 碼農(nóng)飛哥,今天是宅家的一天,30歲了還沒對(duì)象焦慮呀
進(jìn)程號(hào):11659 加油加油

同樣的進(jìn)程池也可以通過with語句來創(chuàng)建

from multiprocessing import Pool
import os
import time

def async_add(max):
 time.sleep(1)
 print("進(jìn)程號(hào):" + str(os.getpid()) + "最大值是" + str(max))

if __name__ == '__main__':
 with Pool(processes=4) as pool:
  # 使用線程池執(zhí)行max計(jì)算
  results = pool.map(async_add, (20, 30, 40, 50))

運(yùn)行結(jié)果是:

進(jìn)程號(hào):11726最大值是20
進(jìn)程號(hào):11725最大值是30
進(jìn)程號(hào):11727最大值是40
進(jìn)程號(hào):11728最大值是50

三、多進(jìn)程和多線程的優(yōu)缺點(diǎn)對(duì)比

多進(jìn)程的優(yōu)點(diǎn)就是穩(wěn)定性好,一個(gè)子進(jìn)程崩潰了,不會(huì)影響主進(jìn)程以及其余子進(jìn)程,各個(gè)子進(jìn)程各用一套獨(dú)立的內(nèi)存空間。多線程的優(yōu)點(diǎn)就是效率高,適用于批處理等功能。
多進(jìn)程的缺點(diǎn)就是創(chuàng)建進(jìn)程的代價(jià)非常大,因?yàn)椴僮飨到y(tǒng)要給每個(gè)進(jìn)程分配固定的資源,并且操作系統(tǒng)對(duì)進(jìn)程的總數(shù)會(huì)有一定的限制,若進(jìn)程過多,操作系統(tǒng)調(diào)度都會(huì)存在問題,會(huì)造成假死狀況。

總結(jié):

到此這篇關(guān)于Python多進(jìn)程的使用詳情的文章就介紹到這了,更多相關(guān)Python多進(jìn)程的使用,內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對(duì)1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部