当前位置: 首页 > 知识库问答 >
问题:

再现AKKA流异步输出

龙浩博
2023-03-14
Source(1 to 3)
  .map { i => println(s"A: $i"); i }
  .map { i => println(s"B: $i"); i }
  .map { i => println(s"C: $i"); i }
  .runWith(Sink.ignore)
A: 1
A: 2
B: 1
A: 3
B: 2
C: 1
B: 3
C: 2
C: 3

共有1个答案

芮朗
2023-03-14

您之所以看到顺序操作,是因为您的所有操作都来自同一个源,因此在同一个异步边界内。要获得您正在寻找的“异步行为”,您需要添加流:

implicit val actorSystem = ActorSystem()
implicit val actorMaterializer = ActorMaterializer()

Source(1 to 3).via(Flow[Int].map{i => println(s"A: $i"); i })
              .via(Flow[Int].map{i => println(s"B: $i"); i })
              .via(Flow[Int].map{i => println(s"C: $i"); i })
              .runWith(Sink.ignore)

每个流将实现为一个独立的执行元。注意:若要获得真正的并发性,ActorSystem正在操作的线程池必须有1个以上的线程

需要记住的一点是:ActorSystem的好处是它负责操作的低层控制,这样开发人员就可以专注于“业务逻辑”。这也可能是一个缺点。根据ActorSystem配置、JVM配置和硬件配置,操作顺序可能仍然是同步的。

 类似资料:
  • 因此,一般的想法是使用来爬取页面并执行HTTP请求(想法和实现与本答案中描述的非常接近。这将创建一个,然后可以使用它(解封为多部分,拆分为各个部分,...)。 我现在的问题是的消耗可能需要一段时间(如果页面很大,解组需要一些时间,可能最后会有一些数据库请求来持久化一些数据,...)。因此,如果下游速度较慢,我希望为背压。默认情况下,下一个HTTP请求将在上一个请求完成后立即启动。 所以我的问题是:

  • 我创建了一个Akka流,它有一个简单的,和。有了这个,我可以很容易地通过它发送元素。现在我想更改这个流,以便返回一个。根据我想更改。 有可能创造出这样的建筑吗?

  • 本文向大家介绍再谈JavaScript异步编程,包括了再谈JavaScript异步编程的使用技巧和注意事项,需要的朋友参考一下 随着前端的发展,异步这个词真是越来越常见了。假设我们现在有这么一个异步任务: 向服务器发起数次请求,每次请求的结果作为下次请求的参数。 来看看我们都有哪些处理方法: Callbacks 最先想到也是最常用的便是回调函数了,我们来进行简单的封装: 嗯,看起来还不错!但是当我

  • 本文向大家介绍再谈Javascript中的异步以及如何异步,包括了再谈Javascript中的异步以及如何异步的使用技巧和注意事项,需要的朋友参考一下 为什么需要异步?why?来看一段代码。 问题1:   这段代码的意思是执行100...次后再执行alert,这样带来的问题是,严重堵塞了后面代码的执行,至于为什么,主要是因为JS是单线程的。 问题2:   我们通常要解决这样一个问题,如果我们需要在

  • 我有一个actor可以从外部系统(UDP/TCP)接收消息。根据传入数据的内容,有时我希望actor回调代码的非AKA部分。 换句话说,我不想用调用和actor并等待一些传入数据,而是异步回调。 我如何实现这一点而不关闭调用对象(在创建ActorRef时会在回调中传递琐碎的内容,但这会捕获调用者)?

  • 默认情况下,createStore() 所创建的 Redux store 没有使用 middleware,所以只支持 同步数据流。 你可以使用 applyMiddleware() 来增强 createStore()。虽然这不是必须的,但是它可以帮助你用简便的方式来描述异步的 action。 像 redux-thunk 或 redux-promise 这样支持异步的 middleware 都包装了