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