Python-多进程
一、多進(jìn)程
from multiprocessing import Process import osdef func1(num):print(num)if __name__ == '__main__':print('主進(jìn)程id為:', os.getpid()) #獲取主進(jìn)程idfor i in range(10):p = Process(target=func1,args=(i,)) #創(chuàng)建子進(jìn)程p.start() #調(diào)起子進(jìn)程print('子進(jìn)程名稱為:', p.name) #獲取子進(jìn)程名稱print('子進(jìn)程id為', p.pid) #獲取子進(jìn)程id?
二、同時(shí)運(yùn)行多進(jìn)程時(shí),每個(gè)進(jìn)程默認(rèn)都擁有一份獨(dú)立的數(shù)據(jù);通過全局變量并不能實(shí)現(xiàn)進(jìn)程間的數(shù)據(jù)通信
a = 1 def func2():global aa +=1print('子進(jìn)程中的a:', a) #子進(jìn)程中的a: 2 if __name__ == '__main__':p = Process(target=func2)p.start()p.join()print('主進(jìn)程中的a:', a) #主進(jìn)程中的a: 1?
三、進(jìn)程間數(shù)據(jù)通信
1、借助Queue、pipe等進(jìn)行通信
from multiprocessing import Process, Queue import os, time, randomdef write_queue(q): #寫數(shù)據(jù)到隊(duì)列for value in range(10):print('Put %s to queue...'%value)q.put(value)time.sleep(2) #每隔2秒寫入數(shù)據(jù)def read_queue(q): #從隊(duì)列讀取數(shù)據(jù)while True:value = q.get(True)print('Get %s from queue.' %value)time.sleep(3) #每隔3秒讀取數(shù)據(jù)if q.empty(): #若隊(duì)列為空,退出循環(huán)print('隊(duì)列為空,請(qǐng)輸入數(shù)據(jù)后再讀')breakif __name__=='__main__':q = Queue() #父進(jìn)程創(chuàng)建Queue,傳給子進(jìn)程pw = Process(target=write_queue, args=(q,))pr = Process(target=read_queue, args=(q,))start = time.time()pw.start() #啟動(dòng)子進(jìn)程pw,寫數(shù)據(jù)pr.start() #啟動(dòng)子進(jìn)程pr,讀數(shù)據(jù) pw.join()end_pw = time.time()run_pw = end_pw - start #計(jì)算寫數(shù)據(jù)的時(shí)間pr.join() #terminate()可強(qiáng)行終止進(jìn)程end_pr = time.time()run_pr = end_pr - start #計(jì)算讀數(shù)據(jù)的時(shí)間print('寫數(shù)據(jù)花費(fèi)時(shí)間:', run_pw, '讀數(shù)據(jù)花費(fèi)時(shí)間', run_pr)?
2、借助Manager實(shí)現(xiàn)進(jìn)程間的數(shù)據(jù)通信;Manager支持的類型非常多,包括: Value,Array,list, dict,Queue, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event等
from multiprocessing import Process, Manager import timedef func(p_dict, p_list): #入?yún)?#xff1a;p_dict為字典,p_list為listfor i in range(10):time.sleep(2)k = str(i) + '*' + str(i)p_dict[k] = i * ifor i in range(10):time.sleep(1)p_list.append(i)if __name__ == "__main__":manager = Manager()dt = manager.dict() #創(chuàng)建dict實(shí)例lt = manager.list() #創(chuàng)建list實(shí)例start = time.time()p = Process(target=func, args=(dt, lt))p.start()p.join()end = time.time()run_time = end - startprint(dt, '\n', lt)print('運(yùn)行時(shí)間為:',run_time) #運(yùn)行時(shí)間大約為30s?
四、進(jìn)程池
1、通過apply_async()可批量創(chuàng)建子進(jìn)程
2、從進(jìn)程池獲取進(jìn)程時(shí),先判斷進(jìn)程池是否已滿;若進(jìn)程池滿了,則需要等待進(jìn)程池重新有空余的進(jìn)程(池中其他被調(diào)用的子進(jìn)程結(jié)束),再繼續(xù)
from multiprocessing import Pool import time def func2(num):time.sleep(2)print(num) if __name__ == '__main__':start = time.time()pool = Pool(5) #創(chuàng)建進(jìn)程池,最多可同時(shí)運(yùn)行5個(gè)子進(jìn)程for i in range(5):pool.apply_async(func=func2,args=(i,)) #apply_async()調(diào)用子進(jìn)程print('執(zhí)行主程序')pool.close()pool.join() #等待子進(jìn)程結(jié)束再結(jié)束主進(jìn)程end = time.time()run_time = end - startprint(run_time)run_time的時(shí)間取決于進(jìn)程池的個(gè)數(shù)pool = Pool(N):
1)當(dāng)N=2時(shí),每次只能從進(jìn)程池取2個(gè)子進(jìn)程,5個(gè)子進(jìn)程要分三次調(diào)用:run_time = 2 + 2 + 2
2)當(dāng)N=3時(shí),每次只能從進(jìn)城池取3個(gè)子進(jìn)程,5個(gè)子進(jìn)程要分2次調(diào)用:run_time = 2 + 2
3)當(dāng)N>=5時(shí),可同時(shí)調(diào)用5個(gè)子進(jìn)程:run_time = 2
?
轉(zhuǎn)載于:https://www.cnblogs.com/jessicaxu/p/8005256.html
總結(jié)
以上是生活随笔為你收集整理的Python-多进程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式11---组合模式(Compos
- 下一篇: Python模块: 命令行解析optio