如何使用线程限制内核数

2024-05-15 14:54:46 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码启动一个线程,在我的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')

以下是日志:

^{pr2}$

enter image description here


Tags: 代码debugimportformatlogging线程level内核
3条回答

由于您使用的是多线程,它实际上是一个单独的进程。所以问题是如何将这个进程固定到cpu上,即How to set processor affinity on OS X? 虽然症状和你的不一样,但很多事情都在这个question中解释了。在

您可以使用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]
>>>

有多线程和多处理。在

可以将进程绑定到cpu核心,但不能将线程绑定到核心。在

进程和线程之间的主要区别在于创建时间、线程生成速度更快并且它们在相同的内存空间中运行,而进程具有独立的内存。在

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()

相关问题 更多 >