【发布时间】:2023-03-22 05:18:01
【问题描述】:
我创建了大约 5000 个后台工作人员,他们在控制台应用程序中进行密集工作。我还使用了一个实例化对象的外部库,比如 ObjectX。在某个时刻,比如 t0,ObjectX 尝试从 os 线程池中获取一个线程并启动它,但我无法控制它如何获取该线程。对于 100 名后台工作人员来说一切正常。对于 1000 个后台工作人员,ObjectX 在 t0 之后大约需要 10 分钟才能获取并启动一个线程。
有没有办法提前为对象将来启动的任何线程设置高优先级?
我认为 1 的答案是“否”,有没有办法限制后台工作人员的优先级,以便以某种方式支持其他一切?即使我只想“支持”ObjectX。
目标是始终有可用资源来运行由 ObjectX 启动的线程,无论机器多么过载。
我在 Windows 64 位机器上使用 C# 和 .Net fr 3.5。
【问题讨论】:
-
我们需要知道您使用的是什么语言或平台。
-
5000 名后台工作人员...疯狂...
-
@user2161465 更多工人!= 完成更多工作。坚持合理数量的工人,比如说.. 10? (N 个内核 * 2 的上限是一个很好的经验法则)
-
@user2161465 您需要创建它们,但不需要实际运行它们。然而,这不会有成效。只需创建几个 BGW 并有一个工作队列来完成每个工作人员在空闲时从其中获取项目的工作队列,您会做得更好。这是生产者/消费者模型,在多线程编程中很常见。当你有那么多工作要做时,不要为每个工作单元创建一个 BGW。您的 CPU 将花费所有时间在线程之间切换,而不是真正进行生产性工作。
-
@user2161465 每个 Worker 线程都会消耗运行时创建、启动和切换到的开销。当你有 5000 个工作人员时,你的处理器必须处理大量的开销,并且除了管理所有工作人员之外几乎没有做任何工作。在生产者消费者中,您可以启动与拥有逻辑 CPU(物理/超线程)大致相同数量的工作人员,然后将工作项发布给他们。在这种情况下,当您需要 ObjectX 线程优先处理时,它应该在最多 100 毫秒内做出响应(可能会更短,具体取决于您的硬件)。
标签: c# .net multithreading