在.NET中保持排队等待线程池的最佳项目数?

时间:2009-12-03 14:10:04

标签: .net threadpool workload

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

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

使用我已经完成的回填实现,如果它们被丢弃,我可以从队列中删除它们,并且只有轮到它们时才将它们放入队列中,可以这么说。

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

我考虑过的问题:

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

您怎么看?

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

也许我应该多尝试一下,并尝试将所有内容转储到线程池中。

新问题:我可以排队的项目数量是否有限制?如果没有,那么这很容易简化我的课程。

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

2 个答案:

答案 0 :(得分:1)

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

  

可以进行的操作次数   排队到线程池是有限的   只有可用的记忆;然而   线程池限制了数量   可以在...中激活的线程   同时进行。默认情况下,   限制是每个250个工作线程   CPU和1,000个I / O完成线程。

     

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

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

答案 1 :(得分:1)

你知道Ami Bar的Smart Thread Pool吗?

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