[英]Java 8 concurrency in AWS lambda?
我們有一個AWS lambda函數,需要通過調用遠程服務來執行一些檢查。 只要其中一個返回假,lambda就可以返回; 否則,所有檢查都需要完成,以確保沒有返回false。 現在我使用並行流來運行任務,因為它們可以獨立運行。
在可能並非罕見的情況下,主線程返回,而其中一個任務仍在運行其線程,或線程被阻塞等待I / O,因為短路已經看到另一個任務的錯誤。 AWS lambda文檔說,當主線程返回時,Lambda中的所有線程都將被凍結。 一旦lambda正在處理下一個請求,他們就會解凍。 繁忙/被阻止的線程在重新激活后是否繼續處理原始任務,或者它將承擔當前請求的新任務?
如果Lambda大師可以分享一些見解,我將非常感激。
我希望我理解正確。 您希望在等待它們完成時執行並行活動。
我剛剛在StackOverflow中讀到了一條評論說:
Streams是關於數據並行的; 數據並行問題是CPU綁定的,而不是IO綁定的。 您似乎只是希望同時運行大量不相關的IO密集型任務。 使用一個普通的線程池; 你的第一個例子是ExecutorService.invokeAll()的理想候選者
也許ExecutorService
可以提供幫助。
我不知道你的代碼是如何構建的,但我可以提出這樣的建議:
int processors = Runtime.getRuntime().availableProcessors();
ExecutorService executorService = Executors.newFixedThreadPool(processors);
List<Callable<Boolean>> services = getURLToCheck().parallelStream()
.map(this::checkService)
.collect(Collectors.toList());
try {
List<Future<Boolean>> futures = executorService.invokeAll(services);
// do your validation with the concurrent tasks.
} catch (InterruptedException e) {
// Handle as you wish
}
還在哪里:
private List<URL> getURLToCheck() {
// Fetch your URL from wherever :)
}
private Callable<Boolean> checkService(URL url){
// Logic to check the service
}
Future
類必須使用可能對您有用的關鍵方法。 isDone()
方法和.get()
。
第一個指示任務是否完成,第二個將等待它完成拋出內部發生但包含在ExecutionException
所有異常。 也許你可以結合這些方法來完成驗證。 快速思考,我想象了一個while循環,你問是否未來完成,如果是這樣,有驗證結果,如果是假的話,打破那個循環。 但我不喜歡哈哈。
希望我清楚自己。 我也希望能有所幫助。 如果沒有,我盡我所能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.