Python 多线程/多处理和限制 CPU 核心关联性

2023-12-22

在Python中,您可以创建新的线程和进程来运行给定的任务multiprocessing.Pool, multiprocessing.ThreadPool, concurrent.futures.ProcessPoolExecutor, and concurrent.futures.ThreadPoolExecutor.

默认情况下,这些线程/进程以其父进程相同的 CPU 核心关联性运行,即所有可用核心/线程。

在 Linux/Unix 系统上,可以使用以下命令更改 CPU 核心关联性os.sched_setaffinity(pid, mask)。问题是这仅限于某些 Linux/Unix 系统。

有的是psutilpython 库公开了设置 CPU 核心关联性的能力psutil.Process().cpu_affinity(CPUS) where CPUS是一个整数列表,标识进程应使用哪些 CPU 核心/线程,从 0 开始。

问题在于,通常操作系统 CPU 调度程序可以处理给定进程应使用哪个核心/线程的挑选和选择,而不是让最终用户决定使用哪些 CPU 核心/线程。

我的问题是是否可以创建线程/进程池并限制每个实例使用 X 个 CPU 核心/线程,但不限制它们的确切核心关联性?

例如,如果我有16核的PC并想创建4个进程,我可以创建一个multiprocessing.Pool(processes=4)目的。现在,如果我希望这 4 个子进程中的每一个都被限制为仅使用 2 个 CPU 核心,我将不得不使用psutil抢先选择 2 个 CPU 核心并将它们分配给该进程,从可用的 CPU 核心列表中删除这 2 个 CPU 核心,并对所有 4 个进程重复该过程。

但这并不理想,如果我给一个进程提供系统中两个最弱的核心会怎么样?或者,如果这 2 个核心在物理上距离较远(例如现代多芯片 AMD Ryzen CPU 或双 CPU 插槽系统的情况)。

我想让操作系统自动为每个进程调度 2 个核心,并根据需要调整它们,而不必为每个进程手动设置和取消设置 CPU 核心。

有没有办法在 Python 中完成这个任务?


前段时间我有类似的需求,所以我编写了一个 CPUResourceManager 类来跟踪我分配给进程的核心。在这里你可以调用get_processors方法来获取您将使用的核心列表。您可以使用 PSUTIL 设置核心关联性,就像您已经在做的那样。当您的过程完成后,使用以下命令返回核心free_processors method.

from typing import NamedTuple
from enum import Enum


class CPUResponse(NamedTuple):
    """
    This is the response when the CPUResourceManager is asked for some cores.
    """
    success: bool     # whether or not there are enough cores available
    processors: list  # the list of processors to be used by the process


class ProcState(Enum):
    """
    Represents the state of a processor core.  This is only 
    represents what we are having the cores do.  Not what other unrelated
    processes on the machine are doing
    """
    idle = 0
    busy = 1


class CPUResourceManager:
    def __init__(self, cpu_count=max(cpu_count() - 2, 1)) -> None:

        self.cpu_count = cpu_count

        self.processors = {i: ProcState.idle for i in range(self.cpu_count)}

    def cpu_avalaible_count(self):
        available = [
            p for p, state in self.processors.items() if state == ProcState.idle
        ]
        return len(available)

    def get_processors(self, count=1):
        """Get some available cores"""
        available = [
            p for p, state in self.processors.items() if state == ProcState.idle
        ]

        if len(available) >= count:
            cpus = available[:count]
            for p in cpus:
                self.processors[p] = ProcState.busy
            return CPUResponse(True, available[:count])
        else:
            return CPUResponse(False, [])

    def free_processors(self, processors: list):
        """return the cores when you are done"""
        for p in processors:
            if p in self.processors:
                self.processors[p] = ProcState.idle
            else:
                # manager was likely resized and this processor
                # should no longer be considered available
                pass
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 多线程/多处理和限制 CPU 核心关联性 的相关文章

随机推荐

  • PHP:启动 PayPal 结帐的简单方法?

    我有功能齐全的购物车解决方案 我想要的只是我实际传递产品名称 总数 退货地址和我的贝宝地址的代码 以便它可以将我引导到购物车 有人能引导我走向正确的方向吗 PayPal 有上百万个不同的版本 我了解到我需要的是 paypal 网站付款 有人
  • TCP流回放工具

    我正在寻找一种用于记录和重放 TCP 流一侧以进行测试的工具 我看到记录整个 TCP 流 服务器和客户端 用于测试防火墙等的工具 但我正在寻找的是一种工具 它仅记录客户端提交的流量 带有计时信息 然后重新提交到服务器进行测试 由于 TCP
  • Django - Crispy Forms - 自定义输入定位和内联单选按钮

    我不久前一直在使用 django crispy forms 并我想知道是否有一种方法可以设置输入的位置 例如col md XX类或其他东西 使其看起来更好 而不仅仅是字段列表 这是一个例子 This is a normal render o
  • Neo4j 浏览器无法在 Google Chrome 中运行

    在 MacOS Yosemite 10 10 3 中升级到最新的 XCode Command Tools 后 无法使用 Chrome 版本 42 0 2311 90 64 位 作为 neo4j 浏览器客户端 不过 Safari 运行良好 有
  • 高效的纯文本模板引擎

    我有一个简单的警报系统 可以抓取网络上的号码 将它们与预定义的文本模板混合以获取警报 并将其发送给客户 警报是非常简单的纯文本 所以除了纯文本 数字 简单函数 例如 ifthenelse 之外 我不会期望太多 越快越好 那么有没有现成的开源
  • 使用 realloc 调整缓冲区大小

    如果指向的区域被移动 则会出现 free ptr 已完成 您能解释一下上面的内容吗realloc 此行来自 calloc malloc realloc 和 free 的手册页 我认为这更好地解释了这一点 如果没有足够的空间 扩展当前块 当前
  • 暂停NS操作

    I have NSOperationQueue和一些NSOperations in it NSInvocationOperations 尤其 此操作会进行一些计算并相应地更改 UI 元素的状态 当然 通过performSelectorOnM
  • 如何在我的用户名中使用带有 @ 符号的 linux 命令行 ftp? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我的用户名有一个时 如何在 Linux 命令行上运行它 中间签个字 ftp u user password host destinati
  • 这个生产者-消费者实现中是否存在竞争条件?

    在 操作系统概念 Silberschatz 第 9 版 的 3 4 1 节中 作者提出了生产者 消费者问题 并给出了以下使用循环缓冲区的实现 第 125 126 页 Shared variables define BUFFER SIZE 1
  • Rails 4从数据库填充下拉值

    我有一个 Rails 形式的下拉菜单 这工作正常 但我怎样才能使它动态 与模型数据交互 我有一个控制器 其操作包含 list List all 我怎样才能填充id and name in my combobox 我一直在四处寻找 但我不清楚
  • 从 PHP 匿名函数访问变量

    我有以下带有静态变量的类 如何从匿名 PHP 函数中访问类的静态函数 class MyClass public static function MyFunction mylocalparam MyStaticClass MyStaticMe
  • 如何修复“java.sql.SQLSyntaxErrorException:'字段列表'中的未知列'product0_.return_policy'”异常?

    当我尝试在浏览器上运行 URL 时 我收到此 SQLSyntaxErrorException 字段列表 中的未知列 product0 return policy GET一切products 看这里 https i stack imgur c
  • 反应按钮的 onClick 属性:

    1 和 2 有什么区别React onClick gt handleDelete id 1 onClick handleDelete id 2 为什么 2 会导致无限循环 而 1 却工作得很好 我找不到任何关于 React 中 onClic
  • 在 GlassFish 中将 JSF 输入提交值的请求字符编码设置为 UTF-8

    我的所有值中插入的值都有问题
  • ICS 上区分平板电脑和智能手机

    据我所知 默认情况下 ICS 之前 为了区分平板电脑和智能手机 开发人员可以使用 Android 清单中的 sdk 版本 除了屏幕尺寸和 openGL 过滤器 现在 随着 ICS 在 SP 和平板电脑上运行 如果我需要区分 SP 和平板电脑
  • 在 Kotlin 中,这个 get() 做了什么

    我对 Kotlin 很陌生 想知道get login email txt toString do 是否设定email String get and set value 字段后面表示自定义 getter 和 或 setter 的声明 这是使用
  • 安装 Ruby gems 时的开发人员工具问题

    我正在尝试将 puma 安装到我的 MacOS 10 13 6 上 要安装 puma 我运行命令gem install puma但它回来了 Building native extensions This could take a while
  • 带点符号的多重导出

    我有这个代码 侧边栏 jsx class Sidebar extends Component render return div this props children div class Item extends Component re
  • 如何让VBA宏在后台持续运行?

    我想监视一个值并在满足某些条件时收到电子邮件通知 我有一个像这样的宏 Do While True Worksheet Calculate If Value gt 10 Then SendEmail End If Sleep 60 CLng
  • Python 多线程/多处理和限制 CPU 核心关联性

    在Python中 您可以创建新的线程和进程来运行给定的任务multiprocessing Pool multiprocessing ThreadPool concurrent futures ProcessPoolExecutor and