我需要调试使用该multiprocessing模块的 Python 3 程序。
multiprocessing
我想跟踪(多核机器的)哪些核心正在使用以及如何使用。
问:我正在寻找一种方法,让 Python 代码确定哪个核心正在运行它。
我发现最接近的方法是使用以下内容:
multiprocessing.current_process()._identity[0] - 1
撇开这样的代码似乎“落后于 API”这一事实,1据我所知,初始化_identity属性的代码没有引用底层硬件2,我认为这是不能令人满意的。
_identity
要在 Python 中跟踪正在运行的核心,特别是当你使用 multiprocessing 模块时,确实没有直接的 API 来获取当前运行进程所绑定的 CPU 核心。但是,你可以通过一些技巧来实现这一点,尽管它并不是通过 multiprocessing 本身提供的接口。
下面是几种方法,可以帮助你确定哪个核心正在运行某个进程:
psutil
psutil 是一个跨平台的库,可以用来获取关于进程和系统的详细信息。你可以使用 psutil.Process().cpu_num() 方法来获取当前进程的 CPU 核心编号。
psutil.Process().cpu_num()
首先,安装 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 核心。
psutil.Process(os.getpid()).cpu_num()
os.sched_getaffinity()
如果你的程序运行在 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 核心的集合。尽管它不能直接告诉你进程正在运行的核心,但它能帮助你确定进程可以在这些核心中运行。
os.sched_getaffinity(0)
如果你想确保每个进程在特定的 CPU 核心上运行,你可以通过设置 CPU 亲和性来绑定进程到指定的核心。psutil 提供了 cpu_affinity() 方法来设置和查询进程的 CPU 亲和性。
cpu_affinity()
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 是推荐的解决方案。