2016-12-30 69 views
2

下面發佈的代碼啓動一個單線程,啓動我的macbookpro上的4個核心。 有沒有辦法限制線程應該使用多少個內核?如何通過線程限制核心數量

import threading 

    import logging 
    logging.basicConfig(level=logging.DEBUG, format='(%(threadName)s) %(message)s',) 

    def func(): 
     logging.debug('starting') 
     m=0 
     for i in range(500000000): 
      m+=i 
     logging.debug('exiting') 

    thread = threading.Thread(target=func) 
    thread.start() 

    logging.debug('completed') 

這裏是日誌:

Loaded sitecustomize.py 
(Thread-1) starting 
(MainThread) completed 
(Thread-1) exiting 
[Finished in 128.0s] 

enter image description here

回答

2

有多線程和多處理。

您可以將進程綁定到cpu-core,但不能將線程綁定到核心。

進程和線程之間的主要區別是創建時間,線程產生得更快,並且它們運行在相同的內存空間中,而進程具有單獨的內存。

import multiprocessing as mp 
import psutil 


def spawn(): 
    procs = list() 
    n_cpus = psutil.cpu_count() 
    for cpu in xrange(n_cpus): 
     affinity = [cpu] 
     d['affinity'] = affinity 
     p = mp.Process(target=run_child, kwargs=d) 
     p.start() 
     procs.append(p) 
    for p in procs: 
     p.join() 
     print('joined') 

def run_child(affinity): 
    proc = psutil.Process() # get self pid 
    print('PID: {pid}'.format(pid=proc.pid)) 
    aff = proc.cpu_affinity() 
    print('Affinity before: {aff}'.format(aff=aff)) 
    proc.cpu_affinity(affinity) 
    aff = proc.cpu_affinity() 
    print('Affinity after: {aff}'.format(aff=aff)) 


if __init__ == '__main__': 
    spawn() 
+0

[該文檔(https://pythonhosted.org/psutil/#psutil.Process.cpu_affinity)不說它在OSX上可用。 –

+0

是的,它可能無法在Solaris上運行。 –

+0

只有「Linux,Windows,FreeBSD」才被列爲支持。 –

1

,因爲你正在使用多線程,它實際上是一個單一的過程。所以問題是如何使這個進程引腳到一個CPU,即How to set processor affinity on OS X? 許多事情在這個question解釋,但你的症狀是不一樣的。

1

你問的是「Processor Affinity」。通常情況下,操作系統的調度程序會照顧到這一點,這是您不應該擔心的事情。是的,你的線程在4個核心之間反彈,但它只使用每個核心的25%左右。

Here's a SuperUser question about setting processor afinity in OSX。它看起來並沒有什麼可以在Python標準庫中找到它,因爲實際的原因很少。

不,您的CPU使用率圖表看起來更漂亮並不是設置CPU親和力的有效理由。

1

您可以用Python psutil設置進程的CPU親和力:

>>> import psutil 
>>> psutil.cpu_count() 
4 
>>> p = psutil.Process() 
>>> p.cpu_affinity() # get 
[0, 1, 2, 3] 
>>> p.cpu_affinity([0]) # set; from now on, process will run on CPU #0 only 
>>> p.cpu_affinity() 
[0] 
>>>