python 指定cpu运行_为进程python多处理指定特定的CPU

这篇博客介绍如何在Python中确保多进程任务不会在运行服务器或调度器的CPU核心上运行,以避免性能问题。通过使用`psutil`库,可以设置进程的CPU亲和性,限制它们在特定核心上运行。示例代码展示了一个多处理池的使用,展示了如何在子进程中修改CPU亲和性。
部署运行你感兴趣的模型镜像

我刚刚在这个项目中遇到了类似的问题,3个服务器/调度器在各自的CPU核心上运行,产生了CPU密集型的工作人员——同时,这些工作人员被设计成使用他们正在运行的特定核心,以充分发挥其潜力。在

我需要确保这样的工作进程永远不会在运行服务器/调度器的CPU核心上产生(或使用——因为一些工作线程也使用多处理),因为这会导致后面的操作出现问题。在

我使用了Ioannis Filippidis'sanswer中的以下代码,它非常适合将任何进程限制为任何核心。我在这个例子中使用了多处理池,但是来自child的代码可以在任何multiprocessing.Process中工作。注意:它在macOS上不起作用。在import multiprocessing as mp

def child(worker: int) -> None:

import psutil

import time

p = psutil.Process()

print(f"Child #{worker}: {p}, affinity {p.cpu_affinity()}", flush=True)

time.sleep(1)

p.cpu_affinity([worker])

print(f"Child #{worker}: Set my affinity to {worker}, affinity now {p.cpu_affinity()}", flush=True)

time.sleep(1 + 3 * worker)

print(f"Child #{worker}: Starting CPU intensive task now for 4 seconds on {p.cpu_affinity()}...", flush=True)

t_end = time.perf_counter() + 4

while time.perf_counter() < t_end:

pass

print(f"Child #{worker}: Finished CPU intensive task on {p.cpu_affinity()}", flush=True)

def main() -> None:

with mp.Pool() as pool:

# noinspection PyProtectedMember

workers: int = pool._processes

print(f"Running pool with {workers} workers")

for i in range(workers):

pool.apply_async(child, (i,))

# Wait for children to finnish

pool.close()

pool.join()

pass

if __name__ == '__main__':

main()

控制台输出:

^{pr2}$

在任务管理器中查看:

192e5a11d2587bfcafd422e860ed6365.png

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们正在讨论进程为什么可以在不同的CPU心上运行。 根据用户提供的引用[1]和引用[2],我们可以得到一些信息: 引用[1]提到:在多计算机上,进程其实是在CPU上不断切换的,由于CPU性能强,处理迅速,我们感觉不到卡顿。操作系统会根据需要将时间分配给不同的进程。 引用[2]则提供了一些查看进程运行在哪个CPU心上的工具(如taskset, top, htop),并说明进程可以在不同的心上调度。 现在,我们需要解释进程为什么可以在不同的CPU心上运行。 关键点: 1. 多处理器:现代计算机通常有多个CPU心,每个心都可以独立执行指令。 2. 操作系统调度:操作系统(如Linux)的调度器负责将进程分配到不同的CPU心上运行,以实现并行处理和提高系统效率。 3. 进程切换:调度器会根据调度策略(如时间片轮转、优先级调度等)在多个进程之间快速切换,使得每个进程都能得到执行。在多系统中,这种切换可以在多个心上同时发生。 4. 进程迁移:调度器可以将一个进程从一个心迁移到另一个心,以实现负载均衡,避免某个心过载而其他心空闲。 因此,进程可以在不同CPU心上运行的原因主要是操作系统的调度机制和多硬件的支持。 我们可以这样组织回答: 首先,解释多处理器架构。 然后,说明操作系统如何通过调度器将进程分配到不同的心。 接着,可以提到负载均衡和进程迁移。 最后,引用提供的参考资料。 注意:用户要求使用中文,并且按照指定的格式(如数学公式的LaTeX格式),但本问题中可能较少涉及数学公式,所以重点放在文字解释上。 同时,按照要求生成相关问题。 回答结构: 1. 多处理器的背景 2. 操作系统的调度作用 3. 具体如何实现(包括进程切换和迁移) 4. 总结 引用标注:在适当的地方标注引用[^1]和[^2]。</think>### 进程可以在不同CPU心上运行的原因 进程能在多个CPU心上运行心机制是**操作系统的调度系统**,这依赖于硬件支持和软件协同工作。以下是详细解释: #### 1. **硬件基础:多处理器架构** - 现代CPU包含多个独立的心(如4、8),每个心都是完整的处理单元,可独立执行指令[^1]。 - 多之间通过**共享内存**和**高速总线**通信,操作系统可将不同进程分配到不同心并行执行。 - 例如:4CPU可同时运行4个进程(或线程),效率远超单切换。 #### 2. **操作系统调度机制** - **时间片轮转**: 调度器为每个进程分配时间片(如10ms),时间耗尽后切换进程。单下是顺序切换(用户感知为并发),多下是真正并行执行[^1]。 - **负载均衡**: 调度器监控各心负载,将新进程分配到空闲心(如`taskset`命令显示心0-3的调度范围[^2])。 - **心绑定与迁移**: - 进程可静态绑定到指定心(如`taskset -c 1 <pid>`[^2])。 - 也可动态迁移:当某心负载过高时,调度器将进程迁移到空闲心(通过`top`的`P`列可观察迁移记录[^2])。 #### 3. **进程与线程的并行能力** - **多进程**:每个进程拥有独立地址空间,操作系统可将其分配到不同心。 - **多线程**:单进程的多个线程共享内存,可分配到多个心并行执行(如Web服务器用多线程处理并发请求)。 #### 4. **用户感知与性能优势** - **无感知切换**: CPU处理速度极快(纳秒级),即使单切换进程,用户也感觉程序“同时运行”[^1]。 - **真并行加速**: 多下并行计算使性能线性提升,例如: - 单:$T_{\text{总}} = \sum T_{\text{进程}}$ - 多:$T_{\text{总}} \approx \max(T_{\text{进程}})$(理想情况) ```mermaid graph LR A[新进程创建] --> B{调度器决策} B -->|心0空闲| C[分配到心0] B -->|心1空闲| D[分配到心1] C --> E[执行完成] D --> E ``` ### 关键技术支持 - **中断机制**:硬件中断通知CPU切换进程。 - **上下文保存**:切换时保存寄存器状态($PC, SP$等),确保恢复执行无误。 - **缓存一致性**:多共享L3缓存,减少内存访问延迟。 > 通过`htop`等工具可验证:进程CPU心编号会动态变化[^2],证明调度器在持续优化心分配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值