管理TPL队列(Managing the TPL Queue)

2019-06-25 14:18发布

我有一个运行各种服务器的扫描的服务。 有问题的网络可以是巨大的(几十万网络节点)。

该软件的最新版本是使用队列/线程架构由我们设计了工作,但效率不高,因为它可以(不是其中最重要的,因为工作可以酿出这是没有处理好子女)

V2快到了,我使用TPL考虑。 现在看来似乎应该非常适合。

我已经看到了这个问题 ,答案,这意味着没有限制的任务TPL可以处理。 在我的简单测试(自旋向上十万任务,并给他们TPL),TPL与外的内存异常( - 尤其是在我的dev的盒子很公平)barfed相当早的。

在扫描需要的时间变长,但5分钟/任务是一个良好的平均。

你可以想像,对于庞大的网络扫描需要相当长的时间,甚至在仡服务器。

我已经有到位,让扫描作业(存储在DB)的多个扫描服务器之间被分割的框架,但问题是我应该如何准确地传递工作向TPL特定服务器上。

我可以监控TPL的队列的大小和(比如说)最糟糕的是,如果它低于几百项? 是否有一个缺点这样做呢?

我还需要处理,其中扫描需要暂停的情况。 这似乎更容易通过不给比消除可能已经被部分处理/重置任务的工作TPL做。

所有的初始任务可以按任意顺序运行。 家长已开始执行后,孩子必须运行,但由于母公司产卵他们,这不应该永远是一个问题。 孩子们可以在任何顺序运行。 正因为如此,我目前设想的是孩子的任务被写回数据库没有直接催生成TPL。 这将允许其他服务器“工作窃取”如果需要的话。

有没有人有这种方式使用第三方物流的经验吗? 是否有我需要知道的任何考虑?

Answer 1:

太平人寿有关启动工作的小户型和并行运行它们。 这是不是监视,暂停或节流这项工作。

您应该看到TPL作为一个低级别的工具,开始“工作”,并同步线程。

关键点:TPL任务=逻辑任务。 逻辑任务是在你的情况下扫描任务(“扫描IP范围从X到Y”)。 这样的任务应该对应一个物理任务“System.Threading.Task”,因为这两个是不同的概念。

您需要安排,协调,监督和暂停逻辑任务自己,因为TPL不理解他们,不能给做。

现在更多的实际问题:

  1. TPL肯定可以启动100K任务,而无需OOM。 该OOM发生,因为你的任务的代码耗尽内存。
  2. 扫描网络,听起来像异步代码很大的情况下,因为当你正在扫描你很可能会等待结果,同时具有并行度很大。 你可能不希望在你的进程的线程500都在等待网络数据包到达。 异步任务合身与TPL因为每次运行任务纯粹变成CPU绑定和小。 这是最理想的第三方物流。


文章来源: Managing the TPL Queue