進(jìn)程

什么是進(jìn)程?

一個(gè)程序運(yùn)行起來(lái)后,代碼+用到的資源稱之為進(jìn)程,它是操作系統(tǒng)分配資源的基本單元

進(jìn)程額創(chuàng)建-multiprocessing

mutiprocessing模塊就是跨平臺(tái)版本的多進(jìn)程模塊,提供了一個(gè)Process類來(lái)代表一個(gè)進(jìn)程對(duì)象,這個(gè)對(duì)象可以理解為是一個(gè)獨(dú)立的進(jìn)程,可以執(zhí)行另外的事情
from multiprocessing import Process
import time

def run_proc():
"""子進(jìn)程要執(zhí)行的代碼"""
while True:
       print("2")
       time.sleep(1)

if __name__ == '__main__':
p = Process(target=run_proc)
p.start()
while True:
    print("1")
    time.sleep(1)

Process參數(shù)如下:

Process(group,target,name,args,kwargs)
  • targest:如果傳遞了函數(shù)的引用,可以任務(wù)這個(gè)子進(jìn)程就執(zhí)行這里代碼
  • args:給target指定的函數(shù)傳遞的參數(shù),以元祖的方式傳遞
  • kwargs:給target指定的函數(shù)傳遞命名參數(shù)
  • name:給進(jìn)程設(shè)定一個(gè)名字,可以不設(shè)定
  • group:指定進(jìn)程組,大多數(shù)情況下用不到
Process創(chuàng)建的實(shí)例對(duì)象的常用方法:
  • strart():啟動(dòng)子進(jìn)程實(shí)例(創(chuàng)建子進(jìn)程)
  • is_alive():判斷進(jìn)程子進(jìn)程是否還在活著
  • join([timeout]):是否等待子進(jìn)程執(zhí)行結(jié)束,或等待多少秒
  • terminate():不管任務(wù)是否完成,立即終止子進(jìn)程

Process創(chuàng)建的實(shí)例對(duì)象的常用屬性:

  • name:當(dāng)前進(jìn)程的別名,默認(rèn)為Process-N,N為1開始遞增的整數(shù)
  • pid:當(dāng)前進(jìn)程的pid(進(jìn)程號(hào))

進(jìn)程間通信-Queue

  • Queue的使用可以使用multiprocessing模塊的Queue實(shí)現(xiàn)多進(jìn)程之間的數(shù)據(jù)傳遞,Queue本身是一個(gè)消息列隊(duì)程序,以下小實(shí)例來(lái)演示一下Queue的工作原理
#coding=utf-8
from multiprocessing import Queue
q=Queue(3) #初始化一個(gè)Queue對(duì)象卜朗,最多可接收三條put消息
q.put("消息1")
q.put("消息2")
print(q.full()) #False
q.put("消息3")
print(q.full()) #True

#因?yàn)橄⒘嘘?duì)已滿下面的try都會(huì)拋出異常,第一個(gè)try會(huì)等待2秒后再拋出異常敢订,第二個(gè)Try會(huì)立刻拋出異常
try:
    q.put("消息4",True,2)
except:
print("消息列隊(duì)已滿尤勋,現(xiàn)有消息數(shù)量:%s"%q.qsize())

try:
    q.put_nowait("消息4")
except:
    print("消息列隊(duì)已滿狂窑,現(xiàn)有消息數(shù)量:%s"%q.qsize())

#推薦的方式,先判斷消息列隊(duì)是否已滿舔株,再寫入
if not q.full():
q.put_nowait("消息4")

#讀取消息時(shí)首启,先判斷消息列隊(duì)是否為空房铭,再讀取
if not q.empty():
    for i in range(q.qsize()):
    print(q.get_nowait())
  • Queue.qsize():返回當(dāng)前隊(duì)列包含的消息數(shù)量;
  • Queue.empty():如果隊(duì)列為空,返回Ture,反之False:
  • Queue.full():如果隊(duì)列滿了,返回True,反之False:
  • Queue.get(block,timeout):獲取隊(duì)列中的一條消息,然后將其從列隊(duì)中移除,默認(rèn)值為True:

進(jìn)程池Pool

  • 當(dāng)需要?jiǎng)?chuàng)建的子進(jìn)程數(shù)量不多時(shí),可以直接利用multirocessing中的Process動(dòng)態(tài)生多個(gè)進(jìn)程,但如果是上百甚至上千個(gè)目標(biāo),手動(dòng)的去創(chuàng)建進(jìn)程的工作兩巨大,就可以用到mulitiprocessing模塊提供的Pool方法
  • 初始化Pool時(shí),可以指定一個(gè)最大進(jìn)程數(shù),當(dāng)有新的請(qǐng)求提交到Pool中時(shí),如果池還沒有滿,那么就會(huì)創(chuàng)建一個(gè)新的進(jìn)程用來(lái)執(zhí)行該請(qǐng)求;但如果池中的進(jìn)程數(shù)已經(jīng)達(dá)到指定的最大值,那么該請(qǐng)求就會(huì)等待,直到池中有進(jìn)程結(jié)束,才會(huì)用之前的進(jìn)程來(lái)執(zhí)行新任務(wù)驻龟,請(qǐng)看下面的實(shí)例:

    -- coding:utf-8 --

      from multiprocessing import Pool
      import os, time, random
    
      def worker(msg):
      t_start = time.time()
      print("%s開始執(zhí)行,進(jìn)程號(hào)為%d" % (msg,os.getpid()))
      # random.random()隨機(jī)生成0~1之間的浮點(diǎn)數(shù)
      time.sleep(random.random()*2)
      t_stop = time.time()
      print(msg,"執(zhí)行完畢,耗時(shí)%0.2f" % (t_stop-t_start))
    
      po = Pool(3) # 定義一個(gè)進(jìn)程池缸匪,最大進(jìn)程數(shù)3
    for i in range(0,10):
    # Pool().apply_async(要調(diào)用的目標(biāo),(傳遞給目標(biāo)的參數(shù)元祖,))
    # 每次循環(huán)將會(huì)用空閑出來(lái)的子進(jìn)程去調(diào)用目標(biāo)
    po.apply_async(worker,(i,))
    
    print("----start----")
    
    po.close() # 關(guān)閉進(jìn)程池翁狐,關(guān)閉后po(進(jìn)程池)不再接收新任務(wù)
      po.join() # 等待po(進(jìn)程池)中所有子進(jìn)程執(zhí)行完成,必須放在close語(yǔ)句之后
    
    print("-----end-----")
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凌蔬,一起剝皮案震驚了整個(gè)濱河市露懒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌砂心,老刑警劉巖懈词,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異计贰,居然都是意外死亡钦睡,警方通過查閱死者的電腦和手機(jī)蒂窒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門躁倒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人洒琢,你說(shuō)我怎么就攤上這事秧秉。” “怎么了衰抑?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵象迎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我呛踊,道長(zhǎng)砾淌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任谭网,我火速辦了婚禮汪厨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘愉择。我一直安慰自己劫乱,他們只是感情好织中,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衷戈,像睡著了一般狭吼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上殖妇,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天刁笙,我揣著相機(jī)與錄音,去河邊找鬼拉一。 笑死采盒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蔚润。 我是一名探鬼主播磅氨,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嫡纠!你這毒婦竟也來(lái)了烦租?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤除盏,失蹤者是張志新(化名)和其女友劉穎叉橱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體者蠕,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窃祝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了踱侣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粪小。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖抡句,靈堂內(nèi)的尸體忽然破棺而出探膊,到底是詐尸還是另有隱情,我是刑警寧澤待榔,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布逞壁,位于F島的核電站,受9級(jí)特大地震影響锐锣,放射性物質(zhì)發(fā)生泄漏腌闯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一雕憔、第九天 我趴在偏房一處隱蔽的房頂上張望姿骏。 院中可真熱鬧,春花似錦橘茉、人聲如沸工腋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)擅腰。三九已至蟋恬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趁冈,已是汗流浹背歼争。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渗勘,地道東北人沐绒。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像旺坠,于是被迫代替她去往敵國(guó)和親乔遮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容