Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 阿克卡河。控制Akka流中一次处理的项目数量_Scala_Akka_Hazelcast_Akka Stream - Fatal编程技术网

Scala 阿克卡河。控制Akka流中一次处理的项目数量

Scala 阿克卡河。控制Akka流中一次处理的项目数量,scala,akka,hazelcast,akka-stream,Scala,Akka,Hazelcast,Akka Stream,Akka streams大大减少了我的样板代码,并包含许多有用的特性。但是,我需要能够限制处理项目的速度。问题是,我正在向一个Hazelcast队列提供数据,该队列连接到一个资源的源链接,以便在一段时间内(从单个在线站点)下载,但进入队列的链接数量可能会增加很多。理想情况下,一次运行的请求不会超过50-60个。Akka Streams中是否有允许我限制一次处理的项目数量的功能 另一个限制是在与某些网站交互时需要复杂的状态管理、代码处理和其他功能。Akka Http在此无法提供帮助。我的网络代码完

Akka streams大大减少了我的样板代码,并包含许多有用的特性。但是,我需要能够限制处理项目的速度。问题是,我正在向一个Hazelcast队列提供数据,该队列连接到一个资源的源链接,以便在一段时间内(从单个在线站点)下载,但进入队列的链接数量可能会增加很多。理想情况下,一次运行的请求不会超过50-60个。Akka Streams中是否有允许我限制一次处理的项目数量的功能

另一个限制是在与某些网站交互时需要复杂的状态管理、代码处理和其他功能。Akka Http在此无法提供帮助。我的网络代码完全是用Jsoup和Apache Http组件编写的,偶尔会调用基于JavaFX的服务器来呈现脚本

我目前尝试使用缓冲区控制输入速率,如文档中所述:

val sourceGraph: Graph[SourceShape[(FlowConfig, Term)], NotUsed] = new HazelcastTermSource(conf.termQueue, conf)
val source = Source.fromGraph(sourceGraph)     
val (killSwitch, last) = source
                .buffer(conf.crawlStreamConf.maxCrawlConcurrency, OverflowStrategy.backpressure)
                .viaMat(new DownloadFlow())(Keep.both)
                .map(x => println(x))
                .to(Sink.ignore).run()

您正在寻找的机制是
mapsync
(或者
mapsyncUnordered
,如果不需要保留排序,就像您的示例中那样)。 这些组合器采用
并行性
参数,其目的是限制阶段可以运行的并行任务的数量

它应该成为
下载流的一部分。
假设您的
DownloadFlow
运行异步代码,您可以这样构造它:

def download(input: Input): Future[Output] = ???

val downloadFlow: Flow[Input, Output, NotUsed] = Flow[Input].mapAsyncUnordered(50)(download)

val (killSwitch, last) = source
                .buffer(conf.crawlStreamConf.maxCrawlConcurrency, OverflowStrategy.backpressure)
                .viaMat(downloadFlow)(Keep.both)
                .map(x => println(x))
                .to(Sink.ignore).run()
由于您的下载流有一个有意义的物化值,它可能会稍微复杂一些,但希望您能理解


有关更多信息,请参阅。

谢谢您,先生。我完全忽略了这个函数:)一个有趣的注释。当并发级别过低时,管道似乎卡住了。如果在最终迭代中要处理的元素少于并发级别,则即使在处理结束时也会发生这种情况。你注意到了吗?有没有办法强制这些记录通过?