python多進程數量對應核數?
02-02
python多線程無法利用多核,所以要開多進程來使用多核,比如tornado部署n份,比如flask的uwsgi的進程池,那麼我想知道,cpu核數和進程數保持什麼比例,能夠最好的利用多核?1:1還是1:1.5?還是有其他計算方式?
謝邀。至少1:1才能充分利用到多核。
但是並不是所有進程都能吃滿 CPU 的,這個和具體程序有關,需要具體測試進行調節。
主要負荷1:1。如果你的主要負荷進程用不滿一個核,那麼再多開進程也不能加速,意義何在?如果主負荷佔滿一個核,進程開越多切換進程的消耗越大。
如果就Apache/nginx+modwsgi/uwsgi/tornado+wsgi app的情況而言,主要負荷如果是wsgi app,毫無疑問應該保持最終wsgi app數量與核心數相近。如果是tornado作為wsgi轉發,它是在自己的進程里起wsgi的,所以要保證tornado的進程數與核心數一致。
比較例外的是balancer+tornado的情況,此時tornado可以上非同步,寫得好一點兒的話可能瓶頸最終會出現在前面的balancer上,因此務必給擔任均衡任務的apache/nginx留個把核心來幹活兒。不過真這種架構沒道理還要把balancer跟tornado擠一台機器上了……
當然主要負荷這個東西根據情況不同是不同的……
1:1比較好,對於支持多線程的模型,線程數一般推薦的至少是1:1.5,這樣可以留一部分線程來做IO。Python的多進程一般要麼是做純計算,要麼是協程模型(沒有IO等待時間,或者等待時間很少),要麼在進程內再使用多線程(非常不推薦,需要了解fork機制),這樣每個核一個進程一般足夠了,進程切換的開銷略大,數量太多的話來回切換反而會降低效率。不過有種情況例外,如果磁碟IO比較多,一般即使是協程,磁碟IO也是同步的,這時候多增加一些進程數也許有幫助。
這個純屬經驗值 可以拍腦袋設置一個 之後不斷調整 我們的做法是 2n - 1
基本公式是n/(1-p) n是核數,p是可以並行任務在總程序中的佔比
n-1 的 1:1
推薦閱讀:
※[Python] 置換CPython 2.7.13的opcode
※Mac下搞 Python 開發用什麼 IDE?
※黃哥Python 出幾個題目大家練習