下面发布的代码会启动一个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]
答案 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亲和力的正当理由。