多线程解决方案

问题描述:

我正在开发一个应用程序,我想它的解决方案......也许......什么都可以很容易地理想化可没那么容易实现所以这里的问题是多线程解决方案

我想设置一堆模块......每个模块都可以用于输入,输出或转换数据。

目的是绘制等输入的流 - > Transform1 - > Transform2 - > Transform3 - >输出 所有的模块可以是单线程或多线程...

这意味着我可以创建多个线程transform2每一个变换300条记录的数据

我真的不知道我应该怎么做,但我想有一个模块控制器,将所有的模块加载到列表中,我也创建了一个Record Queue ...但我不知道如何将数据从一个线程传递到另一个线程并控制多线程进程...

请提供任何建议。

+0

查看SQL Server Integration Services。这正是你想要做的。 – ZippyV 2011-03-04 23:26:07

+0

我不知道你将如何处理模块,但线程之间的通信很容易通过'System.Collections.Concurrent.BlockingCollection '来处理。请参阅http:// *。com/questions/5105382/multiple-producer-single-consumer/5108487#5108487 and http://*.com/questions/4901105/question-on-c-threading-with-rfid/4901877#4901877 and http:// *.com/questions/4252634/how-to-process-queued-items-serially-on-a-low-priority-thread-using-parallel-exte/4252960#4252960了解可能对您有帮助的信息。 – 2011-03-04 23:31:20

这听起来像PLINQ(在.NET 4.0中可用)包含大部分你想要的解决方案的部分。

Parallel LINQ @ MSDN

尤其是地方开始尝试原型将是ForAll()扩展方法。此方法可用于通过并行线程执行可枚举集合中所有项目的工作单元或任务。

ParallelEnumerable @ MSDN
ParallelEnumerable.ForAll() Method @ MSDN

对于你所描述的,你可能会发现它很有用,以创建一个枚举器,可以提供一个项目在时间的流动。 C#yield return语句可用于提供可枚举列表的方法。然后可以通过AsParallel()扩展方法将其制作为ParallelEnumerable

yield (C#) Reference @ MSDN
ParallelEnumerable.AsParallel() @ MSDN

从那里,剩下的工作是确定如何沿着你所需要的处理边界划分的转换。您也可以使用常规枚举/ foreach在您认为并行性不必要的地方迭代工作。

您可能会发现您希望调整并行查询中使用的线程数。可以使用WithDegreeOfParallelism()扩展方法来调整为您的工作/查询创建了多少个线程。

ParallelEnumerable.WithDegreeOfParallelism() @ MSDN

有可能在你的流程,你需要在并行工作来处理的数据集的地方。使用来自System.Collections.Concurrent的并发集合来维护对这些数据集的有序访问。

Thread-Safe Collections @ MSDN

最后,如果你需要的职责更大的分离,你也不妨考虑建模和构建变革在WF(Workflow Foundation中)。

Windows Workflow Foundation Intro @ MSDN

补充:

如果你是积极的,你不希望使用现有的为您设计的.NET设施;您可能想要在更高级别的抽象层面开始建模。鉴于您提到您可能希望移植到Java,我建议您考虑阅读关于Producer::Consumer通信模型。从那里,您可以决定在哪里拆分变换和输入/输出边界,并根据底层基元来处理各个部分。

Other Producer/Consumer Questions on Stack Overflow

此外,您可能希望实现工作队列的级联为您的工作流程。我不知道.NET和Java用户都可以使用的很多现有解决方案。但阅读其他消息队列解决方案可能会给你一些好点子。亚马逊SQS是一个基于云计算的一个浮现在脑海,和MSMQ(和衍生作品)自Windows 2000的

Amazon Simple Queue Service @ AWS
MSMQ (Microsoft Messaging Queue) @ MSDN
Build a Queued WCF Response Service @ MSDN Magazine

+0

我想避免.Net特定功能...我想坚持原始线程....但这是很多有用的信息谢谢:D – Killercode 2011-03-05 00:27:04

在Windows上是一个坚实的可用服务有一个好书,Parallel Programming with Microsoft .NET,有所有的示例源代码可供下载。 Pipelines第7章的例子听起来很像你所描述的。

+0

再次同样的问题....事情是我会喜欢尽可能原始地创建,以便稍后可以轻松移植到java! – Killercode 2011-03-05 00:29:48

有一个使用CCR这样做的优雅方式。

CCR允许您为程序中的每个转换创建一个端口。然后,您可以在这些端口中抛出尽可能多的项目,以便在每个端口的末端处理和附加委托(处理器),或者可以将相同的委托附加到多个端口(以支持多个请求以加入处理)。

以下基本设施齐备

  1. 你可以等待N个请求(数据元素)在港口到达处理批量。
  2. 您可以等待m个不同的数据元素开始处理(在m个不同类型的数据元素/请求上)
  3. 或者这些机制的嵌套级别以支持您拥有的任何类型的处理/转换场景。

这个库的最大优点是你可以避免在分阶段处理问题中完全锁定(如果你的问题类似于多重转换的管道)。因为基本思想是不启动线程(或任务),除非满足所有先决条件。

然后,每个连接到端口的代理都可以在多个线程或单个线程上运行,具体取决于系统上可用的最佳线程或内核数量。你可以找到基本用法sample here