簡體   English   中英

AWS lambda中的Java 8並發?

[英]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.

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