在python並行處理任務時要使用多線程仍是多進程? 說到這個話題,必需要提的GIL( Global Interpreter Lock)全局解釋鎖,當Cpython每次執行字節碼時都要先申請這個鎖。那麼問題就來了,若是使用多線程是比也會受到影響。python
多線程和多進程程序比較,哪一個性能更高?仍是拿一個實例運行來看看吧~ bash
#寫一個簡單的例子,計算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內存 |
配置2app |
4Core | 8GB內存 |
配置3 | 48Core | 64GB內存 |
實驗1:dom
兩端代碼同時在1Core 2GB機器上運行,查看運行結果:ide
從運行結果來看,多線程的程序比多進程的程序效率要高,使用cpu都是99%(因爲機器只有一個Core,多進程沒有體現它的價值)。性能
實驗2:測試
兩段代碼同時在4Core 8GB內存機器上運行,查看運行結果:spa
從運行結果來看,多進程程序效率比多線程程序效率要高1倍還要多。cpu使用上多線程卡在了141%,多進程跑到了379%,這裏體現出多進程的優點。線程
實驗3:
兩段代碼同時在48core 64GB內存機器上跑,查看運行結果:
從運行結果來看,多進程程序cpu能夠跑到715%(程序設置了開啓8個worker進程,因此不會超過800%),而多線程卡在了124%。
經過以上測試結果,已經能夠得出。python下多進程程序要比多線程程序要高效。而且會隨着Core數不斷的增長,性能也會獲得提高。
因此考慮在必定的時間內並行處理一些工做時,最好依靠多進程建立多個做業,以便在多個cpu之間分散負載。