由於未知的原因,一個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時間。