進(jìn)程簡(jiǎn)單使用
Process([group [, target [, name [, args [, kwargs]]]]])
- target:如果傳遞了函數(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ì)象的常用方法:
start():?jiǎn)?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))
import multiprocessing import time def work1(): while True: time.sleep(1) print("------ in work1 ------") def work2(): while True: time.sleep(1) print("------ in work2 ------") if __name__ == '__main__': multiprocessing.Process(target=work1).start() multiprocessing.Process(target=work2).start()
進(jìn)程間通信
初始化Queue()對(duì)象時(shí)(例如:q=Queue()),若括號(hào)中沒有指定最大可接收的消息數(shù)量稚瘾,或數(shù)量為負(fù)值牡昆,那么就代表可接受的消息數(shù)量沒有上限(直到內(nèi)存的盡頭)姚炕;
- Queue.qsize():返回當(dāng)前隊(duì)列包含的消息數(shù)量摊欠;
- Queue.empty():如果隊(duì)列為空,返回True柱宦,反之False 些椒;
- Queue.full():如果隊(duì)列滿了,返回True,反之False掸刊;
- Queue.get([block[, timeout]]):獲取隊(duì)列中的一條消息免糕,然后將其從列隊(duì)中移除,block默認(rèn)值為True忧侧;
import multiprocessing def down_load(queue): data = [11, 22, 33, 44] for temp in data: queue.put(temp) print "=====正在下載數(shù)據(jù)=====" def analysis_data(queue): """ 數(shù)據(jù)處理 :return: """ while not queue.empty(): print queue.get() print "=====完成解析=====" def main(): # 創(chuàng)建一個(gè)隊(duì)列 queue = multiprocessing.Queue() # 創(chuàng)建多個(gè)進(jìn)程石窑,將隊(duì)列的應(yīng)用作為實(shí)參進(jìn)行傳遞 p1 = multiprocessing.Process(target=down_load, args=(queue, )) p2 = multiprocessing.Process(target=analysis_data, args=(queue, )) p1.start() p2.start() if __name__ == '__main__': main()
進(jìn)程池
multiprocessing.Pool常用函數(shù)解析:
- apply_async(func[, args[, kwds]]) :使用非阻塞方式調(diào)用func(并行執(zhí)行,堵塞方式必須等待上一個(gè)進(jìn)程>- 退出才能執(zhí)行下一個(gè)進(jìn)程)蚓炬,args為傳遞給func的參數(shù)列表松逊,kwds為傳遞給func的關(guān)鍵字參數(shù)列表;
- close():關(guān)閉Pool肯夏,使其不再接受新的任務(wù)经宏;
- terminate():不管任務(wù)是否完成,立即終止驯击;
- join():主進(jìn)程阻塞烁兰,等待子進(jìn)程的退出, 必須在close或terminate之后使用徊都;
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()) time.sleep(random.random()*2) t_stop = time.time() print "%s 執(zhí)行完畢沪斟,耗時(shí)%0.2f" % (msg, t_stop-t_start) if __name__ == '__main__': po = Pool(3) for i in range(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不再接收新的請(qǐng)求 po.join() # 等待po中所有子進(jìn)程執(zhí)行完成暇矫,必須放在close語(yǔ)句之后 print "========End========="