簡體   English   中英

如何正確使用Scala期貨?

[英]How to use Scala Futures the right way?

我想知道期貨是否最好僅與Actor結合使用,而不是在不使用Actor的程序中結合使用。 換句話說,在將來執行異步計算是否應該在Actors系統中更好地完成?

這就是為什么我這么說:

1-您執行計算,結果將觸發您可能在另一個線程中執行的某些操作。

例如,我需要花很長時間才能確定某件商品的價格,因此我決定從其主線程啟動一個異步過程。 在此期間,我可能會做其他事情,然后當響應准備就緒/可用或傳達給我時,我會沿着那條路走。

我可以看到使用actor很方便,因為您可以將結果傳遞給actor。 但是使用典型的線程模型,您可以阻塞或....?

2-另一個問題,假設我需要通過在線獲取一些信息來更新參與者列表的年齡。 假設我只有一個未來的任務。 沒有關閉參與者列表嗎? 多線程可能同時訪問該參與者列表。 因此,在將來進行更新將完全是錯誤的,在那種情況下,我們將需要Java並發收集,不是嗎?

也許我看錯了方向,未來根本就不會產生副作用

但是在那種情況下,足夠公平,沒有副作用,但是我們仍然有一個問題,那就是只能從阻塞線程中獲取調用線程返回的值。 我的意思是讓我們想象一下,結果將幫助調用線程更新某些數據結構。 如何異步更新而不以某種方式關閉該數據結構。

我相信諸如OnComplete之類的回調可以用於副作用(在這里嗎?)

不過,無論如何,回調都必須關閉數據結構。 因此,我不知道如何不使用Actor。

PS:我喜歡演員,我只是想更好地了解沒有演員的未來的用法。 我到處都讀到,只有在需要管理狀態時才應使用actor。 在我看來,如果需要在某個點將結果傳達回啟動異步任務的線程,則總體而言,在沒有參與者的情況下,使用future總是涉及阻塞生產線。

當您處理可變狀態時,Actor是很好的,因為它們封裝了可變狀態。 並且僅允許基於消息的交互。

您可以使用Future在其他線程中執行。 因為Scala的Future構成了,所以您不必阻塞Future 因此,如果您的代碼中包含多個Future,則不必等待/阻止它們就可以競爭。 例如,如果您的管道完全是非阻塞或異步的(例如Play和Spray),則可以將Future返回給客戶端。

與參與者相比,期貨是輕量級的,因為您不需要完整的參與者系統。

這是我非常喜歡Martin Odersky的一句話。

沒有所有並發問題的靈丹妙葯。 正確的解決方案取決於需要實現的目標。 您是否要定義對事件或值流做出反應的異步計算? 還是讓自主的孤立實體通過消息進行通信? 還是在可變商店中定義交易? 或者,並行執行的主要目的可能是提高性能? 對於這些任務中的每一項,都有一個可以完成工作的抽象:期貨,反應流,參與者,事務性內存或並行集合。

因此,請根據您的用例和需求選擇抽象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM