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