-1

好的,自从我真的不得不动态地使用很多线程以来已经有一段时间了。

基本上情况是:

我有一个来自数据库查询的大集合,过分地说,100 万行已返回并存储在某种集合(arraylist、map 等)中。我希望能够获取该集合并将其在线程、进程等之间划分,以便可以有效地完成工作。但是我不想将整个集合平均分成不同的进程。我想说 10 个线程,每个线程可以处理 30 行,当他们完成处理他们拥有的内容时,他们会从原始集合中获取更多行。

这是解决这个问题的第一个想法。我不确定集合到线程的动态分配会是什么样子。我最终希望收集所有单独的流程结果并将它们编译到另一个集合中,以供将来处理。我知道查询结果将是非常多的行,并认为最初动态地将部分分配给线程并在它们完成任务时将是处理此问题的最佳方法。

这是一个两部分的问题。一,什么会......说......伪代码看起来像这样?第二,这是处理这种情况的最佳方法吗?

任何帮助将不胜感激。哦,我正在考虑为此使用 C#。

谢谢!

4

2 回答 2

1

我想PLINQ(Parallel Linq)是显而易见的选择。来自 MSDN 的一个简单示例:

var source = Enumerable.Range(1, 10000);


// Opt-in to PLINQ with AsParallel 
var evenNums = from num in source.AsParallel()
               where Compute(num) > 0
               select num;

这通常假设您的收藏中的所有项目和处理都是独立的。另一个选项可能是用于更高级操作的 TPL(任务并行库)。这是 TPL 的一个很好的光线追踪器示例。

于 2013-04-30T20:37:12.243 回答
0

您可以有一个方法负责分发列表的各个部分,然后让各个工作线程在完成当前的部分后请求一个部分。manager 方法必须是线程安全的,但除此之外,它几乎可以自行构建。

于 2013-04-30T20:36:14.583 回答