如何使用线程限制核心数量

时间:2016-12-30 19:12:40

标签: python multithreading

下面发布的代码会启动一个Thread,它会在我的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

4 个答案:

答案 0 :(得分:4)

有多线程和多处理。

您可以将进程绑定到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()

答案 1 :(得分:2)

因为你正在使用多线程,所以它实际上是一个单一的过程。所以问题是如何将该进程引脚设置为cpu,即How to set processor affinity on OS X? 这个question解释了很多事情,但症状与你的不一样。

答案 2 :(得分:2)

您可以使用psutil

在Python中设置进程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]
>>>

答案 3 :(得分:1)

您所询问的内容称为处理器亲和力"。通常情况下,操作系统的调度程序会处理这个问题,这是您不应该担心的事情。是的,你的线程在4个核心之间弹跳,但它只是真正使用了每个核心的25%。

Here's a SuperUser question about setting processor afinity in OSX。在Python标准库中看起来没有任何东西可以摆弄它,因为这样做的实际原因很少。

不,希望您的CPU使用率图表看起来更漂亮不是设置CPU亲和力的正当理由。