簡體   English   中英

如果vertx setPeriodic延遲小於其處理程序執行時間,將會發生什么

[英]what will happen if vertx setPeriodic delay is little than its handler execution time

在使用vertx.setPeriodic設置計時器的工作vertx.setPeriodic ,延遲是100ms但處理程序要花費5000ms 100ms才能完成,如果應用程序長時間運行,會發生什么情況。 會導致內存泄漏問題嗎? 如果可以,如何消除內存問題?

vertx.setPeriodic(100, timer -> {
    vertx.executeBlocking(future -> {
        // here are some blocking code may cause 5000ms to complete the future.
    }, res -> {
    });
})

最終是的,它將導致內存問題,因為,

由於periodicB內部的代碼正在executeBlocking內部執行,因此它將在配置的工作池(具有固定大小)上執行,並且由於未指定order參數,因此每個executeBlocking調用將串行執行(即一個接一個)。

由於periodic在事件循環線程上運行,因此它將永遠不會等待,並且會在經過修復周期(在您的情況下為100 ms)之后繼續觸發。

因此,對周期內代碼的調用將順序執行並堆積起來。 一旦工作池耗盡,對executeBlocking的調用將進入等待狀態。

處理此問題的選擇很少(一種或多種),

  1. 定期有單獨的Worker verticle。
  2. 通過專用於定期的名稱定義單獨的工作池。
  3. 根據運行周期性作業所需的平均時間微調周期性頻率。
  4. 如果您不關心排序,則可以調用executeBlocking,將false指定為ordered的參數。 在這種情況下,可以在工作池上並行執行任何executeBlocking

暫無
暫無

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

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