2016-12-30 60 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] 
>>>