我正在使用 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))
}
上面的代碼會發出并發請求還是順序請求?如果它發出順序請求,那么發出并發請求的正確方法是什么?
uj5u.com熱心網友回復:
我正在使用 Scala 并發模塊
你不是,至少不在顯示的代碼中。
也許你的意思是那里的“ request-scala library”?
但我不確定它是異步工??作還是同步作業
要存在并發,您需要異步。
現在,再次,如果您想知道requests-scala那么它是同步的,這應該從 README 和型別簽名中清楚。
上面的代碼會發出并發請求還是順序請求?
順序的,正如圖書館明確指出的那樣。
如果它發出順序請求,那么發出并發請求的正確方法是什么?
一方面,您可以考慮使用不同的生態系統,因為作者非常清楚他認為您根本不需要異步來提高效率。
要考慮的另一件事是您是否真的需要同時進行三個 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,并且您需要對這些位元組執行其他異步操作,例如將它們寫入磁盤。然后,我個人建議您查看其他生態系統,例如typelevel,因為它們提供了以更原則的方式撰寫此類程式的工具。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/519541.html
標籤:斯卡拉