小能豆

Python 程序如何确定它在哪个核心上运行?

py

我需要调试使用该multiprocessing模块的 Python 3 程序。

我想跟踪(多核机器的)哪些核心正在使用以及如何使用。

问:我正在寻找一种方法,让 Python 代码确定哪个核心正在运行它。


我发现最接近的方法是使用以下内容:

multiprocessing.current_process()._identity[0] - 1

撇开这样的代码似乎“落后于 API”这一事实,1据我所知,初始化_identity属性的代码没有引用底层硬件2,我认为这是不能令人满意的。


阅读 6

收藏
2024-11-20

共1个答案

小能豆

要在 Python 中跟踪正在运行的核心,特别是当你使用 multiprocessing 模块时,确实没有直接的 API 来获取当前运行进程所绑定的 CPU 核心。但是,你可以通过一些技巧来实现这一点,尽管它并不是通过 multiprocessing 本身提供的接口。

下面是几种方法,可以帮助你确定哪个核心正在运行某个进程:

方法 1:使用 psutil

psutil 是一个跨平台的库,可以用来获取关于进程和系统的详细信息。你可以使用 psutil.Process().cpu_num() 方法来获取当前进程的 CPU 核心编号。

首先,安装 psutil

pip install psutil

然后,在你的 multiprocessing 程序中,使用以下代码来跟踪进程使用的 CPU 核心:

import multiprocessing
import psutil
import os

def worker():
    process = psutil.Process(os.getpid())  # 获取当前进程的信息
    cpu_num = process.cpu_num()  # 获取当前进程的CPU核心编号
    print(f"Process {os.getpid()} is running on CPU {cpu_num}")

if __name__ == "__main__":
    processes = []
    for _ in range(4):  # 假设创建4个进程
        p = multiprocessing.Process(target=worker)
        p.start()
        processes.append(p)

    for p in processes:
        p.join()

在这个例子中,psutil.Process(os.getpid()).cpu_num() 返回当前进程使用的 CPU 核心。

方法 2:使用 os.sched_getaffinity()(Linux)

如果你的程序运行在 Linux 系统上,你可以使用 os.sched_getaffinity() 来获取当前进程可以运行的 CPU 核心集合,并推测当前运行在哪个核心上。

示例代码:

import os
import multiprocessing

def worker():
    cpu_affinity = os.sched_getaffinity(0)  # 获取当前进程可用的CPU核心
    print(f"Process {os.getpid()} can run on CPUs: {cpu_affinity}")

if __name__ == "__main__":
    processes = []
    for _ in range(4):  # 假设创建4个进程
        p = multiprocessing.Process(target=worker)
        p.start()
        processes.append(p)

    for p in processes:
        p.join()

os.sched_getaffinity(0) 返回当前进程可以使用的 CPU 核心的集合。尽管它不能直接告诉你进程正在运行的核心,但它能帮助你确定进程可以在这些核心中运行。

方法 3:手动设置 CPU 亲和性(如果需要)

如果你想确保每个进程在特定的 CPU 核心上运行,你可以通过设置 CPU 亲和性来绑定进程到指定的核心。psutil 提供了 cpu_affinity() 方法来设置和查询进程的 CPU 亲和性。

import psutil
import os
import multiprocessing

def worker():
    process = psutil.Process(os.getpid())
    process.cpu_affinity([0])  # 将当前进程绑定到CPU 0
    print(f"Process {os.getpid()} is bound to CPU 0")

if __name__ == "__main__":
    processes = []
    for _ in range(4):  # 假设创建4个进程
        p = multiprocessing.Process(target=worker)
        p.start()
        processes.append(p)

    for p in processes:
        p.join()

总结

  • psutil 是最简单、最可靠的方式来获取进程使用的 CPU 核心,适用于大多数操作系统。
  • os.sched_getaffinity() 是 Linux 下的另一个选择,它提供了进程的 CPU 核心集合,但无法直接告诉你进程运行在哪个核心上。
  • 手动设置 CPU 亲和性 可以确保进程在特定核心上运行,但这通常需要更多的控制,通常不需要在大多数情况下使用。

如果你只需要监视程序运行的核心,使用 psutil 是推荐的解决方案。

2024-11-20