在python并行處理任務(wù)時(shí)要使用多線程還是多進(jìn)程? 說(shuō)到這個(gè)話題,必須要提的GIL( Global Interpreter Lock)全局解釋鎖,當(dāng)Cpython每次執(zhí)行字節(jié)碼時(shí)都要先申請(qǐng)這個(gè)鎖。那么問(wèn)題就來(lái)了,如果使用多線程是比也會(huì)受到影響。
? ? ? ?多線程和多進(jìn)程程序比較,哪個(gè)性能更高?還是拿一個(gè)實(shí)例運(yùn)行來(lái)看看吧~?
?
#寫一個(gè)簡(jiǎn)單的例子,計(jì)算100W個(gè)隨機(jī)數(shù)的和8次,同時(shí)將分散到8個(gè)線程進(jìn)行運(yùn)算。
#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()
#相同的功能,使用多進(jìn)程來(lái)實(shí)現(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()
?
?兩個(gè)代碼片段已經(jīng)寫完了,接下來(lái)我找了三種配置的機(jī)器來(lái)運(yùn)行這兩段代碼:
?
| 配置1 | ? ? ? 1Core | ? ? ? ? ? ? ?2GB內(nèi)存 |
|
配置2 |
? ? ? 4Core | ? ? ? ? ? ? ?8GB內(nèi)存 |
| 配置3 | ? ? ? 48Core | ? ? ? ? ? ? ?64GB內(nèi)存 |
?
實(shí)驗(yàn)1:
兩端代碼同時(shí)在1Core 2GB機(jī)器上運(yùn)行,查看運(yùn)行結(jié)果:
?
從運(yùn)行結(jié)果來(lái)看,多線程的程序比多進(jìn)程的程序效率要高,使用cpu都是99%(由于機(jī)器只有一個(gè)Core,多進(jìn)程沒(méi)有體現(xiàn)它的價(jià)值)。
?
實(shí)驗(yàn)2:
兩段代碼同時(shí)在4Core 8GB內(nèi)存機(jī)器上運(yùn)行,查看運(yùn)行結(jié)果:
?
從運(yùn)行結(jié)果來(lái)看,多進(jìn)程程序效率比多線程程序效率要高1倍還要多。cpu使用上多線程卡在了141%,多進(jìn)程跑到了379%,這里體現(xiàn)出多進(jìn)程的優(yōu)勢(shì)。
?
實(shí)驗(yàn)3:
兩段代碼同時(shí)在48core 64GB內(nèi)存機(jī)器上跑,查看運(yùn)行結(jié)果:
?
從運(yùn)行結(jié)果來(lái)看,多進(jìn)程程序cpu可以跑到715%(程序設(shè)置了開啟8個(gè)worker進(jìn)程,所以不會(huì)超過(guò)800%),而多線程卡在了124%。
?
通過(guò)以上測(cè)試結(jié)果,已經(jīng)可以得出。 python下多進(jìn)程程序要比多線程程序要高效。并且會(huì)隨著Core數(shù)不斷的增加,性能也會(huì)得到提升。
?
所以考慮在一定的時(shí)間內(nèi)并行處理一些工作時(shí),最好依靠多進(jìn)程創(chuàng)建多個(gè)作業(yè),以便在多個(gè)cpu之間分散負(fù)載。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

