【问题标题】:Make an opaque IEnumerable query Parallel (PLINQ)使不透明的 IEnumerable 查询并行 (PLINQ)
【发布时间】:2014-02-07 16:23:11
【问题描述】:

在一个函数中,我想对作为参数提供的 IEnumerable 进行并行处理。

这个 IEnumerable 已经是一些链接的结果,即:

IEnumerable argument = InitialEnumerable.Select(x => DoHeavyProcessing(x))...

但对我来说它是不透明的——我无法修改这个参数的创建方式。我不知道它是如何构造的。

现在,当我调用 argument.AsParallel() 时,它没有用 - AsParallel() 只会并行化它右侧的处理,但之前的所有工作都是按顺序运行的。

相反,我需要以某种方式解析这个 IEnumerable 并“装饰”它,以便并行处理繁重的工作。

【问题讨论】:

    标签: c# linq parallel-processing plinq


    【解决方案1】:

    没有办法做到这一点。 IEnumerable 是专门设计的,在您已经获取之前的项目之前,您无法获取给定项目。

    生成IEnumerable 的任何东西都需要为并行生成这些项目提供某种类型的支持。

    【讨论】:

    • 谢谢 - 所以我想最好的方法是让我的函数有一个签名,比如: function(ParallelQuery data) 以便用户知道他必须把 AsParallel() 放在某个地方使用它
    • @AdamDabrowski 它仍然可以接受IEnumerable 类型的签名,只要调用者在他们的Select 之前仍然使用类似AsParallel 或类似的东西来进行昂贵的投影。让您的方法接受 IEnumerable 仅仅意味着您执行的任何进一步操作都将被序列化。当然,如果您接受ParallelQuery,那么您要做的主要事情就是向调用者发送一个信号,表明他们应该并行化您的查询。如果您想这样做,那么请务必这样做。如果大多数调用者不需要并行化他们的查询...
    • 我知道我可以保留更通用的签名(或稍后检查参数/强制转换)-在我的情况下,顺序查询将以与并行查询不同的方式处理(并行是生产者-消费者SQLBulkCopy 在单个线程中使用的模型)。我希望用户从界面中获得提示。感谢您的出色回应,Servy!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    相关资源
    最近更新 更多