Akka.Net流比并行循环慢

时间:2018-08-15 19:20:31

标签: c# .net akka.net

我有以下两个代码:

var jbesSource = Source.From(jobSeekers);
var runnableGraph = jbesSource
    .Via(Flow.FromGraph(GraphDsl.Create(b =>
    {
        Flow<(JobSeeker_JBE, List<JBE>), Dictionary<JBE, ICollection<JobCI>>, NotUsed> worker =
        FindJobsFlow.Instance(cache);
        var merge = b.Add(new Merge<Dictionary<JBE, ICollection<JobCI>>>(8));
        var balancer2 = b.Add(new Balance<JobSeeker_JBE>(8));

        b.From(balancer2).Via(filterJobAlertsFlow).Via(worker).To(merge);
        b.From(balancer2).Via(filterJobAlertsFlow).Via(worker).To(merge);
        b.From(balancer2).Via(filterJobAlertsFlow).Via(worker).To(merge);
        b.From(balancer2).Via(filterJobAlertsFlow).Via(worker).To(merge);
        b.From(balancer2).Via(filterJobAlertsFlow).Via(worker).To(merge);
        b.From(balancer2).Via(filterJobAlertsFlow).Via(worker).To(merge);
        b.From(balancer2).Via(filterJobAlertsFlow).Via(worker).To(merge);
        b.From(balancer2).Via(filterJobAlertsFlow).Via(worker).To(merge);

        return new FlowShape<JobSeeker_JBE, Dictionary<JBE, ICollection<JobCI>>>
                   (balancer2.In, merge.Out);
    })).Async())
        .Async()
        .ToMaterialized(Sink.Seq<Dictionary<JBE, ICollection<JobCI>>>(), Keep.Right);

这比上面的要快得多

Parallel.ForEach(jobseekers, js =>
{
    var jobs = FindJobs(js);
}

两个人都做完全相同的工作。

FindJobs函数使用REST API,因此基本上是IO。

任何想法为什么简单的循环会比Akka.Streaming快得多?

1 个答案:

答案 0 :(得分:1)

Akka.NET流的主要用例是处理可能包含许多不同处理步骤的长(可能无限)事件流。如果您要并行调用多个作业,则此操作绝对不是满足您需求的合适工具。

话虽如此,如果您想异步处理不同的事件,可以这样处理:

jbesSource
    // use SelectAsync if the order of output values must match order of inputs
    .SelectAsyncUnordered(maxParallelism, FindJobsAsync)
    .RunWith(Sink.Seq<T>(), materializer);

maxParallelism可以是Environment.ProcessorCount,也可以是与您的计算机核心数量匹配的任何值。