multiprocessing python_Python多进程运行——Multiprocessing基础教程1
生活随笔
收集整理的這篇文章主要介紹了
multiprocessing python_Python多进程运行——Multiprocessing基础教程1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
多進程是什么
多進程指的是操作系統同時支持多個處理器的能力。在支持多任務操作系統中,一個應用程序會被分解成多個獨立運行的較小的程序。操作系統會將這些線程分配到多核處理器,以提升系統性能。為什么需要多進程
假設我們的計算機只有一個單核的處理器,然后同時被分配了幾個任務,那么它就不得不在各個任務中來回切換,短暫地執行其中一個任務,然后中斷,然后短暫地執行下一個任務,以保持所有的進程都在運行。這就像一個廚師在做面條,切幾秒鐘菜,跑去揉幾下面,再趕緊查看下湯。所以同時需要完成的任務越多,同時跟蹤所有的任務就越困難。這就是多進程的必要性,也是多核處理器的威力所在。一個支持多進程的操作系統可以做到:- 同時指揮多個CPU,即擁有一個以上的CPU的計算機
- 指揮多核CPU,即擁有兩個及以上的獨立處理單元的CPU
用Python執行多進程
學習Python的優勢之一就是它擁有海量的第三方模塊。今天我們再來介紹一個能幫你輕松完成多進程并行的模塊:multiprocessingmultiprocessing模塊支持使用類似于threading模塊的API生成進程。multiprocessing模塊提供了本地和遠程計算機的并行處理能力,并且通過使用創建子進程,有效地避開了全局解釋器鎖(GIL)。因此,multiprocessing模塊允許程序員充分利用機器上的多個處理器。目前,它可以在Unix和Windows上運行。multiprocessing的模塊的API非常簡單直觀,可以讓新手迅速上手在多個進程之間劃分工作。我們現在看一個簡單的例子:#?importing?the?multiprocessing?module?import?multiprocessing?def?print_cube(num):?????print("Cube:?{}".format(num?*?num?*?num))?def?print_square(num):?
????print("Square:?{}".format(num?*?num))?if?__name__?==?"__main__":?#?creating?processes?
????p1?=?multiprocessing.Process(target=print_square,?args=(10,?))?
????p2?=?multiprocessing.Process(target=print_cube,?args=(10,?))?#?starting?process?1&2
????p1.start()?
????p2.start()?#?wait?until?process?1&2?is?finished?
????p1.join()?
????p2.join()?#?both?processes?finished?
????print("Done!")?運行結果是這樣的:Square:?100
Cube:?1000
Done!其實代碼的含義非常簡單了,首先我們導入了multiprocessing模塊,隨后定義了兩個函數,它們的功能分別是打印一個數的三次方和打印一個數的平方。之后關鍵的步驟來了,要創建多個進程,首先需要創建Process類的對象。在這個例子中Process類接收了兩個參數:
- target:在進程中被執行的函數
- args:向被執行函數傳遞的參數
p2?=?multiprocessing.Process(target=print_cube,?args=(10,?))?隨后的start()方法就是開始執行p1,p2兩個進程。在進程開始執行后,主程序仍然會繼續執行。為了讓主程序暫停,我們就使用了join()方法。它的作用就是將主程序暫停,直到等待p1和p2完成。一旦它們都完成了,再執行之后的語句。讓我們再舉一個例子,來理解同一個腳本中運行不同進程的概念。在下面的例子中,我們打印運行目標函數的進程ID:#?importing?the?multiprocessing?module?import?multiprocessing?import?os?def?worker1():?#?printing?process?id?
????print("ID?of?process?running?worker1:?{}".format(os.getpid()))?def?worker2():?#?printing?process?id?
????print("ID?of?process?running?worker2:?{}".format(os.getpid()))?if?__name__?==?"__main__":?#?printing?main?program?process?id?
????print("ID?of?main?process:?{}".format(os.getpid()))?#?creating?processes?
????p1?=?multiprocessing.Process(target=worker1)?
????p2?=?multiprocessing.Process(target=worker2)?#?starting?processes?
????p1.start()?
????p2.start()?#?process?IDs?
????print("ID?of?process?p1:?{}".format(p1.pid))?
????print("ID?of?process?p2:?{}".format(p2.pid))?#?wait?until?processes?are?finished?
????p1.join()?
????p2.join()?#?both?processes?finished?
????print("Both?processes?finished?execution!")?#?check?if?processes?are?alive?
????print("Process?p1?is?alive:?{}".format(p1.is_alive()))?
????print("Process?p2?is?alive:?{}".format(p2.is_alive()))?上面這個程序的輸出結果如下:ID?of?main?process:?28628
ID?of?process?running?worker1:?29305
ID?of?process?running?worker2:?29306
ID?of?process?p1:?29305
ID?of?process?p2:?29306
Both?processes?finished?execution!
Process?p1?is?alive:?False
Process?p2?is?alive:?False主python腳本有一個獨立的進程ID,當我們創建進程對象p1和p2時,multiprocessing模塊會生成具有不同進程ID的新進程。os.getpid()函數是用來獲取運行當前目標函數的進程的ID。上述輸出結果也可以看到,使用os.getpid()獲取的進程ID與通過進程類的pid屬性獲得的ID是一致的。上面的每個進程都是獨立運行的,并且擁有自己獨立的內存空間。一旦目標函數執行完成,進程就會終止。在上面的程序中,我們使用了Process類的is_alive()方法來檢查進程是否仍然處于活動狀態。最后用下面的圖來幫助理解記憶新進程與主Python腳本的不同之處:圖1.進程ID示意圖這篇文章是對Python中的多進程的一個初步介紹。接下來的幾篇文章將進一步介紹多進程相關知識。敬請期待吧!
總結
以上是生活随笔為你收集整理的multiprocessing python_Python多进程运行——Multiprocessing基础教程1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 分组求和_MySql基础语法
- 下一篇: python 数据分析班_Python数