【发布时间】:2009-12-03 14:10:04
【问题描述】:
我正在构建一个后台处理引擎,它支持丢弃待处理和正在处理的项目。这适用于需要对某些输入元素进行大量处理的 winforms 应用程序,因此我正在构建一个队列引擎,我可以在其中将工作负载项排入队列,当它们被处理时,我会收到结果通知。
问题是,这个队列开始时几乎总是包含很多项目,我认为与其将所有内容都转储到线程池,不如只将前 N 个项目放入线程池,并继续回填当它们被处理时。我想这样做的原因是,一旦我将它们转储到线程池中,它们将被处理,即使它们被标记为丢弃,它们仍然会占用排队时间。
通过我所做的回填实现,如果项目被丢弃,我可以从队列中删除它们,并且只有在轮到它们时才将它们放入队列中,可以这么说。
所以问题是,我将如何计算这个数字 N,即要放入并保留在线程池队列中的项目数。
我考虑过的问题:
- 我可能想要将 2 * 个处理器(我认为这是典型的项目数)加入队列,以确保所有处理器都在工作
- 但是,如果某些项目的实际处理速度非常快(可能会发生),那么线程池中的队列在我自己的类可以回填更多工作之前就已经耗尽,所以也许我想要一个更大的数字避免未充分利用处理器
- 我是否应该创建一些自动调整例程来根据每个项目的当前时间计算最佳数字,这样如果它们都超快,数字会高得多,如果处理需要一点时间,它应该保持在低位吗?
你怎么看?
新:好的,由于其中一个答案,我会再解释一下。放入队列的每个项目都由独特的东西作为键。如果我使用与现有项目相同的键将另一个项目转储到队列中,则该旧项目被视为“丢弃”,应该被删除。如果正在处理项目,则工作负载项目上的属性设置为 true,即“IsDicarded”属性,处理方法负责调用该属性。如果它检测到丢弃的项目,它应该提前退出,不返回任何结果。
也许我应该多做一些试验,然后尝试将所有内容都转储到线程池中。
新问题:我可以排队的物品数量有限制吗?如果没有,那么这会很容易地简化我的课程。
注意:当我说“冗长的处理”时,我的意思是大约 1-10 秒。线程池甚至是最好的吗?我在网上看到关于“处理应该快速”的注释,但从未提及“快速”是什么。这里是毫秒级的快吗?
【问题讨论】:
标签: .net threadpool workload