Scala请求模块:是否可以进行并发请求



我正在使用Scala并发模块,但我不确定它是异步工作还是同步工作?我有一个URL列表,它是图像URL,我想进行并发请求并获得Array[Bytes]:


object Runner extends App {
def getBytesFromUrl(url:String) = {
requests.get(url).bytes
}
val urls = Seq(
"https://cdn.pixabay.com/photo/2014/02/27/16/10/flowers-276014__340.jpg",
"https://cdn.pixabay.com/photo/2014/02/27/16/10/flowers-276014__340.jpg",
"https://cdn.pixabay.com/photo/2014/02/27/16/10/flowers-276014__340.jpg"
)

// Would this make concurrent or sequential requests ?
val result = urls.map(url => getBytesFromUrl(url))

} 

上面的代码是并发请求还是顺序请求?如果它发出顺序请求,那么发出并发请求的正确方法是什么?

我正在使用Scala并发模块

您不在,至少不在显示的代码中
也许你的意思是">请求scala库">在里面?

但我不确定它是异步工作还是同步

为了使并发性存在,您需要异步
现在,如果您想知道请求scala,那么它是同步的,这应该从README和类型签名中清楚。

上面的代码会发出并发请求还是顺序请求?

Sequential,正如库明确指出的那样。

如果它发出顺序请求,那么发出并发请求的正确方法是什么?

首先,您可以考虑使用不同的生态系统,因为作者已经非常清楚,他认为您在大多数情况下根本不需要异步才能高效
另一件需要考虑的事情是,您是否真的需要同时进行三个HTTP调用。

无论如何,您可以使用Future.traverse来做您想做的事情。

object Runner {
def getBytesFromUrl(URL: String): Array[Byte] = {
requests.get(url).bytes
}
def getBytesFromUrls(urls: List[String]): Future[List[Array[Byte]]] =
Future.traverse(urls)(url => Future(getBytesFromUrl(url)))
}

然后,如果您想返回同步陆地,您可以编写FutureAwait


个人免责声明,如果您确实有很多URL,并且需要对这些字节执行其他异步操作,比如将它们写入磁盘。然后,我个人建议您查看其他生态系统,如类型级别,因为这些生态系统提供了以更原则的方式编写此类程序的工具。

最新更新