如何设计并行处理工作流程
我有关于数据分析的情况。
基本上有四个步骤:
从队列中读取任务或通过API(可能是Web服务)接收消息以触发服务
根据步骤1中的参数向远程服务提交请求
等待远程服务完成并下载
对从步骤3下载的数据执行处理
上面的四个步骤看起来像一个序列工作流程。 我的问题是我该如何扩展它。
每天我可能需要执行数百到数千个此任务。 如果我可以并行完成,那将会有很大帮助。 例如,一次运行20个任务。
那么我们可以配置Windows工作流基础来并行运行吗?
感谢。
答案 0 :(得分:0)
您可能想要使用pfx(http://www.albahari.com/threading/part5.aspx),然后您可以控制要获取的线程数,并使用PLINQ我觉得有用。
所以,你循环遍历网址列表,也许是从文件或数据库中读取,然后在你的选择中你可以调用一个函数来进行处理。
例如,如果您可以详细了解是否要将提取和处理设置在不同的线程上,则可能更容易提供更完整的答案。
<强>更新强>
我就是这样做的,但我也在使用ConcurrentQueue
(http://www.codethinked.com/net-40-and-system_collections_concurrent_concurrentqueue),所以我可以在读取数据时将数据放入队列。
这样每个线程都可以安全地出列,而不必担心必须锁定你的收藏。
Parallel.For(0, queue.Count, new ParallelOptions() { MaxDegreeOfParallelism = 20 },
(j) =>
{
String i;
queue.TryDequeue(out i);
// call out to URL
// process data
}
});
您可能希望将数据放入另一个并发集合中并单独处理,这取决于您的应用程序需求。
答案 1 :(得分:0)
根据您的任务和工作流的建模方式,您可以使用Parallel活动并为要执行的不同任务创建不同的分支。每个分支都有自己的逻辑,WF运行时将启动第二个WCF请求,以便在等待第一个响应时立即检索数据。这要求您明确地对分支的数量建模,但允许在每个分支中进行不同的活动。
但是从您的描述中可以看出,您对每个任务都有相同的步骤,在这种情况下,您可以使用ParallelForEach活动对其进行建模,并对一组任务进行迭代。每个任务对象都需要包含用于请求的所有信息。这要求每个任务都有相同的步骤,但您可以根据需要输入任意数量的任务。
最有效的方法取决于您的情况。