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

在 scala 中混合异步库和同步代码的一些最佳实践是什么?

通和裕
2023-03-14

我正在编写一段scala代码,其中第三方库返回一个Future[Boolean]对象,而我需要在我的scala代码中使用这个Future对象,这段代码完全是以同步方式编写的。

目前,我正在对第三方库操作执行Await.result,以确保它只返回布尔值。有没有更好的处理方法,我的scala代码需要一个布尔值来做进一步的操作?

共有1个答案

年运珧
2023-03-14

正如路易斯在评论中指出的那样,一般来说,除了等待未来,别无选择。

也就是说,您可能有一些关于等待位置的选择

例如,如果您有像这样的代码

val result = Await.result(someFuture, Duration.Inf)
f(result)

将来运行f可能会更有用

Await.result(someFuture.map(f), Duration.Inf)

如果f碰巧阻塞,那么可能值得将f包装在阻塞中,或者显式使用执行上下文来处理大量被阻塞的线程(例如,对于map来说,线程可能比内核多的线程)。

通常,您需要尽可能地将 Awaits 移动到代码的最外边缘,甚至可以移动边缘(如果可以)。

 类似资料:
  • 问题内容: 我最近写了我的第一个Android应用程序,大约有8,000-10,000行代码。一直阻碍我使用常规设计模式的一件事是android对异步调用(打开对话框,活动等)的大量使用。因此,我的代码很快就开始看起来像“意大利面”,而我最终开始不喜欢某些类。 是否有适用于任何人都会推荐的系统的特定设计模式或编程方法?对于编写可管理的异步代码有什么建议吗? 问题答案: 使用全局变量 如果您不想用简

  • 我正在开发一个Flutter应用程序,但想知道在从UI调用异步代码时应该做什么--比方说UI小部件的构建方法。 例如,我的应用程序通过一个服务类连接Firebase,该服务类使用Async-Await样式从Firebase获取记录。使用await可以确保我的服务类的方法在返回UI端之前完成记录检索。 吉米

  • 我正在尝试设置log4j2以使用异步记录器将所有消息记录到滚动文件中。 是否有一种方法可以创建另一个记录程序来捕获所有事件?还有别的想法吗? 下面是我的log4j2.xml:

  • 在这个msdn页面上,我读到: 应用程序不能为特定请求混合同步和异步方法。如果调用BeginGetRequestStream方法,则必须使用BeginGetResponse方法检索响应。 反之亦然吗?如果调用异步读取响应,是否还应该使用编写请求? 我的请求很小(100-1000个字符),响应可以很大。Jeffrey Richter的这篇文章似乎是说,在小负载的情况下,它可以同步完成(并且不需要设置

  • null my Library的核心逻辑 客户将使用我们的库,他们将通过传递builder对象来调用它。然后,我们将通过使用对象构造一个URL,并通过执行该对象对该URL进行HTTP客户端调用,在将响应作为JSON字符串返回后,我们将通过创建对象将该JSON字符串按原样发送给客户。有些客户会调用,有些可能会调用方法,所以我需要在库中分别提供两个方法。 接口: 您将如何实现同步和异步方法给定上述标准

  • 我基本上有一个对象,它存储了一个项目的3D位置和其他属性,如速度。该位置每隔100毫秒由一个单独的威胁计算一次。另一种威胁访问这些属性并修改其中的一些属性。 我的第一个想法是简单地对每个属性使用,但据我所知,对volatile属性的每个操作都必须是原子的。由于这两种威胁都允许在某些情况下改变某些属性(如速度),这似乎不起作用。 我的下一个想法是使用Java的关键字,同步每个getter和sette