一篇文章学习Python中的多进程
基本知識:
- 一、什么是多進程 Multiprocessing
 - 二、添加多進程 Process
 - 三、存儲進程輸出 Queue
 - 四、效率對比 threading & multiprocessing
 - 五、進程池 Pool
 - 六、共享內存 shared memory
 - 七、進程鎖 Lock
 
一、什么是多進程 Multiprocessing
支持并行運算,充分利用計算機的多核CPU
二、添加多進程 Process
import multiprocessing as mpdef process_job(a,b):print("a:",a)print("b:",b)if __name__=="__main__":p1 = mp.Process(target=process_job,args=(1,2)) # 定義一個進程p1p1.start() # 開啟進程p1p1.join() # 將進程p1加入到主進程三、存儲進程輸出 Queue
多進程調用的函數不能有返回值,故使用Queue存儲結果。
import multiprocessing as mpdef process_job(q):res = 0for i in range(10):res += iq.put(res)if __name__=="__main__":q = mp.Queue()p1 = mp.Process(target=process_job,args=(q,)) # 注意args必須是可迭代的類型,但只有一個參數的時候,要加一個逗號p2 = mp.Process(target=process_job,args=(q,))p1.start()p2.start()p2.join()p1.join()print("res1:",q.get())print("res2:",q.get())四、效率對比 threading & multiprocessing
import multiprocessing as mp import threading as td import timedef job(q):res = 0for i in range(100000):res += i + i**2 + i**3q.put(res)def multiProcess(): # 多進程運算q = mp.Queue()p1 = mp.Process(target=job,args=(q,)) p2 = mp.Process(target=job,args=(q,)) p1.start()p2.start()p2.join()p1.join()print("multiProcess_res:",q.get()+q.get())def multiThread(): # 多線程運算q = mp.Queue()t1 = td.Thread(target=job,args=(q,))t2 = td.Thread(target=job,args=(q,))t1.start()t2.start()t2.join()t1.join()print("numliThread_res:",q.get()+q.get())def normal(): # 普通運算res = 0for _ in range(2):for i in range(100000):res += i + i**2 + i**3print("normal_res:",res)if __name__=="__main__":t1 = time.time()normal()t2 = time.time()print("normal_time:",t2-t1)multiProcess()t3 = time.time()print("multiProcess_time:",t3-t2)multiThread()t4 = time.time()print("multiThread_time:",t4-t3)結果:運行時間 多進程 < 多線程 (多線程和普通的運行時間差不多)
normal_res: 49999666671666600000 normal_time: 0.2157750129699707 multiProcess_res: 49999666671666600000 multiProcess_time: 0.14542102813720703 numliThread_res: 49999666671666600000 multiThread_time: 0.2052018642425537五、進程池 Pool
相當于批量處理多進程
 與 Process 不同的是,Pool 有返回值,返回值是一個 list,依次是每個進程執行的結果。
六、共享內存 shared memory
在上一篇文章的第六部分線程鎖可以看到,對于一個全局變量,多個線程之間共享全局變量,一個線程對全局變量修改以后,其他線程訪問到的是修改后的全局變量,會造成數據的混亂。
 與多線程不同的是,多進程不會共享全局變量,多個進程之間不進行交流,任意一個進程對全局變量的修改都不會影響到其他進程對全局變量的訪問。
 比如:
結果:互不影響
1 2 10 3 20 30因此,需要設置共享內存,讓進程之間進行交流:
 1、Shared Value
 通過使用 Value 將數據存儲在一個共享的內存表中
其中 d 和 i 參數用來設置數據類型的,d 表示一個雙精浮點類型,I 表示一個帶符號的整型。
 2、Shared Array
 mutiprocessing中,有還有一個Array類,可以和共享內存交互,來實現在進程之間共享數據
這里的Array和numpy中的不同,它只能是一維的,不能是多維的。同樣和Value 一樣,需要定義數據形式,否則會報錯。
 參數數據類型表
七、進程鎖 Lock
1、不加進程鎖
import multiprocessing as mp import timedef job(v, num):for _ in range(5):time.sleep(0.1) # 暫停0.1秒,讓輸出效果更明顯v.value += num # v.value獲取共享變量值print(v.value, end="")def multicore():v = mp.Value('i', 0) # 定義共享變量p1 = mp.Process(target=job, args=(v,1))p2 = mp.Process(target=job, args=(v,3)) # 設定不同的number看如何搶奪內存p1.start()p2.start()p1.join()p2.join() if __name__ == '__main__':multicore()結果:進程1和進程2在相互搶著使用共享內存v
1 4 5 8 9 12 13 16 17 202、加進程鎖
import multiprocessing as mp import timedef job(v, num, l):l.acquire()for _ in range(10):time.sleep(0.1)v.value += numprint(v.value)l.release()def multicore():l = mp.Lock()v = mp.Value('i', 0)p1 = mp.Process(target=job, args=(v, 1, l))p2 = mp.Process(target=job, args=(v, 3, l))p1.start()p2.start()p1.join()p2.join()if __name__ == '__main__':multicore()結果:顯然,進程鎖保證了進程p1的完整運行,然后才進行了進程p2的運行
1 2 3 4 5 8 11 14 17 20總結
以上是生活随笔為你收集整理的一篇文章学习Python中的多进程的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 【数据挖掘】数据挖掘和数据分析基础
 - 下一篇: Tensorflow实现LSTM详解