0

我正在构建一个后台处理引擎,它支持丢弃待处理和正在处理的项目。这适用于需要对某些输入元素进行大量处理的 winforms 应用程序,因此我正在构建一个队列引擎,我可以在其中将工作负载项排入队列,当它们被处理时,我会收到结果通知。

问题是,这个队列开始时几乎总是包含很多项目,我认为与其将所有内容都转储到线程池,不如只将前 N 个项目放入线程池,并在它们出现时继续回填处理。我想这样做的原因是,一旦我将它们转储到线程池中,它们就会被处理,即使它们被标记为丢弃,它们仍然会占用队列时间。

通过我所做的回填实现,如果项目被丢弃,我可以从队列中删除它们,并且只有在轮到它们时才将它们放入队列中,可以这么说。

所以问题是,我将如何计算这个数字 N,即要放入并保留在线程池队列中的项目数。

我考虑过的问题:

  • 我可能想将 2 * 数量的处理器排入队列,我看到这是典型的项目数,以确保所有处理器都在工作
  • 但是,如果某些项目的实际处理速度非常快(可能会发生),那么线程池中的队列在我自己的类可以回填更多工作之前就已经耗尽,所以也许我想要一个更大的数字以避免未充分利用处理器
  • 我是否应该创建一些自动调整例程来根据每个项目的当前时间计算最佳数字,这样如果它们都超快,数字会高得多,如果处理需要一些时间,它应该保留低的?

你怎么看?

:好的,由于答案之一,我将解释更多。放入队列的每个项目都由独特的东西键入。如果我使用与现有项目相同的键将另一个项目转储到队列中,则该旧项目被视为“丢弃”,应该被删除。如果正在处理项目,则工作负载项目上的属性设置为 true,即“IsDicarded”属性,处理方法负责调用该属性。如果它检测到丢弃的项目,它应该提前退出,不返回任何结果。

也许我应该做更多的试验,并尝试将所有内容都转储到线程池中。

新问题:我可以排队的物品数量有限制吗?如果没有,那么这将很容易简化我的课程。

注意:当我说“冗长的处理”时,我的意思是大约 1-10 秒。线程池甚至是最好的吗?我在网上看到关于“处理应该快速”的注释,但从未提及“快速”是什么。这里是毫秒级的快吗?

4

2 回答 2

1

您是否可以通过修改您的项目以在执行任何工作之前首先检查它们是否仍然需要来简化方法?这将解决限制池中数量的问题,因为您可以简单地将它们全部添加,并且当每个项目得到处理时,如果不再需要,它将退出。

可以排队到线程池的操作数量仅受可用内存的限制;但是,线程池限制了进程中可以同时处于活动状态的线程数。默认情况下,限制为每个 CPU 250 个工作线程和 1,000 个 I/O 完成线程。

您可以使用 GetMaxThreads 和 SetMaxThreads 方法控制最大线程数。

http://msdn.microsoft.com/en-us/library/0ka9477y.aspx

于 2009-12-03T14:14:49.060 回答
1

你知道阿米吧的智能线程池吗?

似乎它的实现允许您取消未处理的项目并根据需要动态增加线程,直到硬限制;我个人使用100 * Environment.ProcessorsCount

于 2009-12-03T14:15:10.463 回答