• python设置CPU亲缘性


    由于未知的原因,一个python程序总是占用一个CPU核心,导致一个使用率满的,另一个很低,不均衡。固然可以在任务管理中设置进程相关性为所有处理器,但是每次都设置太过麻烦,查了下可以使用windows的API设置,但是要在python中设置,需要做点工作。

    首先,python要有pywin32的支持,地址:http://sourceforge.net/projects/pywin32/

    其次,下载affinity模块安装,这里提供了访问SetProcessAffinityMask的方法,地址:http://pypi.python.org/pypi/affinity

    然后就可以使用了。举例如下,在程序的开始地方加上代码

    1 import affinity # need pywin32
    2 import os
    3 
    4 affinity.set_process_affinity_mask(os.getpid(), 3L) # set all cpu to run

    运行程序,在任务管理器中可以看到程序在使用两个CPU。

    说明:程与指定cpu绑定:SetProcessAffinityMask(GetCurrentProcess(), dwMask);

    dwMask为CPU序号的或运算值:1(0001)代表只运行在CPU1,2(0010)代表只运行在CPU2,3(0011)代表可以运行在CPU1和CPU2,以此类推。

    还没找到python获取CPU核心数量的函数,所以手工查看一下了,貌似win32con可以做到,linux下也没研究。。。

     

    附:

    CPU亲缘性介绍

    按照默认设置,当系统将线程分配给处理器时,Windows使用软亲缘性来进行操作。这意味着如果所有其他因素相同的话,它将设法在它上次运行的那个处理器上运行线程。让线程留在单个处理器上,有助于重复使用仍然在处理器的内存高速缓存中的数据。

    有一种新的计算机结构,称为NUMA(非统一内存访问),在该结构中,计算机包含若干块插件板,每个插 件板上有4个CPU和它自己的内存区。
    当CPU访问的内存是它自己的插件板上的内存时,NUMA系统运行的性能最好。如果CPU需要访问位于另一个插件板上的内 存时,就会产生巨大的性能降低。在这样的环境中,就需要限制来自一个进程中的线程在共享同一个插件版的CPU上运行。为了适应这种计算机结构的需要,Windows允许你设置进程和线程的亲缘性。换句话说,你可以控制哪个CPU能够运行某些线程。这称为硬亲缘性。请注意,子进程可以继承进程的亲缘性。

    注意:

    (1)无论计算机中实际拥有多少个CPU,Windows98及以前系统只使用一个CPU,上述API不被支持。

    (2)在大多数环境中,改变线程的亲缘性就会影响调度程序有效地在 各个CPU之间移植线程的能力,而这种能力可以最有效地使用CPU时间。

     

  • 相关阅读:
    后端程序员之路 28、一个轻量级HTTP Server的实现
    后端程序员之路 27、LogStash
    后端程序员之路 26、CAP理论
    后端程序员之路 25、Redis Cluster
    后端程序员之路 24、Redis hiredis
    后端程序员之路 23、一个c++的api framework
    后端程序员之路 22、RESTful API
    后端程序员之路 21、一个cgi的c++封装
    后端程序员之路 20、python复习
    flask框架的学习
  • 原文地址:https://www.cnblogs.com/njucslzh/p/2649554.html
Copyright © 2020-2023  润新知