【发布时间】:2026-01-21 00:10:02
【问题描述】:
我有一个包含一些处理组件的 ETL 项目。单个组件是基于 BlockingCollection 的生产者-消费者。所有组件都通过 Task.Run 并行执行,等待项目从其他组件到达,处理它们并将结果放入它们的输出集合(想想管道)。所有组件都通过 Task.Run() 执行。
是否可以在不为进程设置处理器亲和性的情况下强制任务在单核上运行(我不希望它们占用 100% 的多核 CPU)(这似乎有点矫枉过正)?
请注意,我仍然希望任务以并行方式运行 - 仅在单个内核上。
【问题讨论】:
-
处理器亲和性似乎是最好的选择。为什么你认为这是矫枉过正?
-
如果我可以将其设置为只使用一个核心,那么亲和力会很棒。但据我所知(我在这里可能错了)你需要明确指定一个核心 - 所以如果你有更多这样的进程,你必须以某种方式在它们之间“协商”要使用哪些核心(如果我有 8 个核心可用并且两个这样的进程,我希望它们在不同的内核上)。
-
您是否关心您的任务在哪个内核上执行,或者您是否关心您的任务消耗的 CPU 功率是否超过单核提供的 CPU 功率? Is this an XY problem? 此外,虽然单核可以提供多任务处理,但您不能在单核上并行执行任何操作。
-
我不关心正在使用哪个内核 - 我只想限制进程 CPU 时间以最多占用一个内核。亲和力“迫使”我明确我需要哪个核心——我不想这样做。你是对的:单核/并行 - 我的意思是我想要多任务处理(线程上下文切换)。
-
我认为这个问题的答案是不,不可能强制进程以您希望的方式在单个内核上运行
标签: c# .net task-parallel-library