我有以下两个代码:
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快得多?
答案 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
,也可以是与您的计算机核心数量匹配的任何值。