我正在使用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)))
}
然后,如果您想返回同步陆地,您可以编写Future
或Await
。
个人免责声明,如果您确实有很多URL,并且需要对这些字节执行其他异步操作,比如将它们写入磁盘。然后,我个人建议您查看其他生态系统,如类型级别,因为这些生态系统提供了以更原则的方式编写此类程序的工具。