python設定CPU親緣性

來源:互聯網
上載者:User

由於未知的原因,一個python程式總是佔用一個CPU核心,導致一個使用率滿的,另一個很低,不均衡。固然可以在任務管理中設定進程相關性為所有處理器,但是每次都設定太過麻煩,查了下可以使用windows的API設定,但是要在python中設定,需要做點工作。

首先,python要有pywin32的支援,地址:http://sourceforge.net/projects/pywin32/

其次,下載affinity模組安裝,這裡提供了訪問SetProcessAffinityMask的方法,地址:http://pypi.python.org/pypi/affinity

然後就可以使用了。舉例如下,在程式的開始地方加上代碼

1 import affinity # need pywin322 import os3 4 affinity.set_process_affinity_mask(os.getpid(), 3L) # set all cpu to run

運行程式,在工作管理員中可以看到程式在使用兩個CPU。

說明:程與指定cpu綁定:SetProcessAffinityMask(GetCurrentProcess(), dwMask);

dwMask為CPU序號的或運算值:1(0001)代表只運行在CPU1,2(0010)代表只運行在CPU2,3(0011)代表可以運行在CPU1和CPU2,以此類推。

還沒找到python擷取CPU核心數量的函數,所以手工查看一下了,貌似win32con可以做到,linux下也沒研究。。。

 

附:

CPU親緣性介紹

按照預設設定,當系統將線程分配給處理器時,Windows使用軟親緣性來進行操作。這意味著如果所有其他因素相同的話,它將設法在它上次啟動並執行那個處理器上運行線程。讓線程留在單個處理器上,有助於重複使用仍然在處理器的記憶體快取中的資料。

有一種新的電腦結構,稱為NUMA(非統一記憶體訪問),在該結構中,電腦包含若干塊擴充卡,每個插 件板上有4個CPU和它自己的記憶體區。
當CPU訪問的記憶體是它自己的擴充卡上的記憶體時,NUMA系統啟動並執行效能最好。如果CPU需要訪問位於另一個擴充卡上的內 存時,就會產生巨大的效能降低。在這樣的環境中,就需要限制來自一個進程中的線程在共用同一個外掛程式版的CPU上運行。為了適應這種電腦結構的需要,Windows允許你設定進程和線程的親緣性。換句話說,你可以控制哪個CPU能夠運行某些線程。這稱為硬親緣性。請注意,子進程可以繼承進程的親緣性。

注意:

(1)無論電腦中實際擁有多少個CPU,Windows98及以前系統只使用一個CPU,上述API不被支援。


(2)在大多數環境中,改變線程的親緣性就會影響發送器有效地在 各個CPU之間移植線程的能力,而這種能力可以最有效地使用CPU時間。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.