在python并行處理任務時要使用多線程還是多進程? 說到這個話題,必須要提的GIL( Global Interpreter Lock)全局解釋鎖,當Cpython每次執(zhí)行字節(jié)碼時都要先申請這個鎖。那么問題就來了,如果使用多線程是比也會受到影響。
? ? ? ?多線程和多進程程序比較,哪個性能更高?還是拿一個實例運行來看看吧~?
?
#寫一個簡單的例子,計算100W個隨機數(shù)的和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()
#相同的功能,使用多進程來實現(xiàn)
#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()
?
?兩個代碼片段已經(jīng)寫完了,接下來我找了三種配置的機器來運行這兩段代碼:
?
配置1 | ? ? ? 1Core | ? ? ? ? ? ? ?2GB內(nèi)存 |
配置2 |
? ? ? 4Core | ? ? ? ? ? ? ?8GB內(nèi)存 |
配置3 | ? ? ? 48Core | ? ? ? ? ? ? ?64GB內(nèi)存 |
?
實驗1:
兩端代碼同時在1Core 2GB機器上運行,查看運行結果:
?
從運行結果來看,多線程的程序比多進程的程序效率要高,使用cpu都是99%(由于機器只有一個Core,多進程沒有體現(xiàn)它的價值)。
?
實驗2:
兩段代碼同時在4Core 8GB內(nèi)存機器上運行,查看運行結果:
?
從運行結果來看,多進程程序效率比多線程程序效率要高1倍還要多。cpu使用上多線程卡在了141%,多進程跑到了379%,這里體現(xiàn)出多進程的優(yōu)勢。
?
實驗3:
兩段代碼同時在48core 64GB內(nèi)存機器上跑,查看運行結果:
?
從運行結果來看,多進程程序cpu可以跑到715%(程序設置了開啟8個worker進程,所以不會超過800%),而多線程卡在了124%。
?
通過以上測試結果,已經(jīng)可以得出。 python下多進程程序要比多線程程序要高效。并且會隨著Core數(shù)不斷的增加,性能也會得到提升。
?
所以考慮在一定的時間內(nèi)并行處理一些工作時,最好依靠多進程創(chuàng)建多個作業(yè),以便在多個cpu之間分散負載。
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
