【问题标题】:How should i design my workflow so that taks can run parallel我应该如何设计我的工作流程,以便任务可以并行运行
【发布时间】:2011-07-29 00:47:39
【问题描述】:

如何设计并行处理工作流程

我有一个关于数据分析的情景案例。

基本上有四个步骤:

  1. 从队列中读取任务或通过 API(可能是 Web 服务)接收消息以触发服务

  2. 根据步骤 1 中的参数向远程服务提交请求

  3. 等待远程服务完成并下载

  4. 对从步骤 3 下载的数据执行处理

上面的四个步骤看起来像一个序列工作流程。 我的问题是如何扩展它。

每天我可能需要执行成百上千的这项任务。 如果我可以并行执行它们,那将有很大帮助。 例如一次运行 20 个任务。

那么我们可以将 Windows 工作流基础配置为并行运行吗?

谢谢。

【问题讨论】:

    标签: .net-4.0 parallel-processing workflow-foundation-4


    【解决方案1】:

    您可能想要使用 pfx (http://www.albahari.com/threading/part5.aspx),然后您可以控制要获取多少线程,并使用 PLINQ 我觉得很有帮助。

    因此,您循环遍历 url 列表,可能从文件或数据库中读取,然后在您的选择中,您可以调用一个函数来进行处理。

    例如,如果您可以更详细地说明您是否希望在不同的线程上进行获取和处理,那么给出更完整的答案可能会更容易。

    更新:

    这就是我的处理方式,但我也在使用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
                    }
                });
    

    您可能希望将数据放入另一个并发集合并单独处理,这取决于您的应用程序需求。

    【讨论】:

    • 嗨詹姆斯,我认为我选择使用工作流的目的是为了简化我的编程......这样我就可以避免处理那些并行编程的东西......相反,当我建筑师时实现它它....我想将整个工作流程视为一项任务...以便每当调用任务时..一个线程将负责一个工作流程...就像Web服务一样.......不确定是什么我觉得是对的……谢谢你的回复……
    • 使用 PFX 将简化您的编码,而 PLINQ 非常有用,因为它可以更多地抽象出线程。
    【解决方案2】:

    根据您的任务和工作流程的建模方式,您可以使用并行活动并为要执行的不同任务创建不同的分支。每个分支都有自己的逻辑,WF 运行时将在等待第一个响应时立即启动第二个 WCF 请求以检索数据。这需要您明确地对分支数量进行建模,但允许在每个分支中进行不同的活动。

    但从您的描述看来,您对每个任务都有相同的步骤,在这种情况下,您可以使用 ParallelForEach 活动对其进行建模,并让它遍历一组任务。每个任务对象都需要包含用于请求的所有信息。这要求每个任务都具有相同的步骤,但您可以根据需要放入任意数量的任务。

    最有效的方法实际上取决于您的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-05
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      相关资源
      最近更新 更多