python並行處理任務時 該用多進程?還是該用多線程?

      在python並行處理任務時要使用多線程還是多進程? 說到這個話題,必須要提的GIL( Global Interpreter Lock)全局解釋鎖,當Cpython每次執行字節碼時都要先申請這個鎖。那麼問題就來了,如果使用多線程是比也會受到影響。

       多線程和多進程程序比較,哪個性能更高?還是拿一個實例運行來看看吧~ 


#寫一個簡單的例子,計算100W個隨機數的和8次,同時將分散到8個線程進行運算。
#thread.py

#!/usr/bin/env python

import random
import threading

results = []

def compute():
    results.append(
        sum([random.randint(1,100) for i in range(1000000)]))

def main():        
    workers = [threading.Thread(target(compute) for  x in range(8))]

    for worker in workers:
        worker.start()
    
    for woker in workers:
        worker.join()
    print("Result: %s" % results)
   
   
if __name__  == "__main__":
    main()
    

    
#相同的功能,使用多進程來實現
#worker.py

#!/usr/bin/env python

import multiprocessing
import random

def compute(n):
    return sum(
        [random.randint(1,100) for i in range(1000000)])
        
def main():
    pool = multiprocessing.Pool(8)
    print("Results: %s" % pool.map(compute, range(8)))
    
if __name__ == "__main__":
    main()


 兩個代碼片段已經寫完了,接下來我找了三種配置的機器來運行這兩段代碼:


配置1
      1Core             2GB內存

配置2

      4Core             8GB內存
配置3      48Core             64GB內存


實驗1:

兩端代碼同時在1Core 2GB機器上運行,查看運行結果:


wKioL1Wfmc6RZe2aAAJODN1oYpM336.jpg

從運行結果來看,多線程的程序比多進程的程序效率要高,使用cpu都是99%(由於機器只有一個Core,多進程沒有體現它的價值)。


實驗2:

兩段代碼同時在4Core 8GB內存機器上運行,查看運行結果:


wKioL1Wfm2ijoMj-AAGoBy2Asr8801.jpg

從運行結果來看,多進程程序效率比多線程程序效率要高1倍還要多。cpu使用上多線程卡在了141%,多進程跑到了379%,這裏體現出多進程的優勢。


實驗3:

兩段代碼同時在48core 64GB內存機器上跑,查看運行結果:


wKiom1Wfm0XgGPqPAAIzZQw09_A258.jpg

從運行結果來看,多進程程序cpu可以跑到715%(程序設置了開啓8個worker進程,所以不會超過800%),而多線程卡在了124%。


通過以上測試結果,已經可以得出。python下多進程程序要比多線程程序要高效。並且會隨着Core數不斷的增加,性能也會得到提升。


所以考慮在一定的時間內並行處理一些工作時,最好依靠多進程創建多個作業,以便在多個cpu之間分散負載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章