簡體   English   中英

Scala參與者,期貨和系統調用導致線程泄漏

[英]Scala actors, futures and system calls resulting in Thread leaks

我正在運行一個具有不同角色(scala角色)的復雜軟件。 其中一些執行使用scala期貨以避免鎖定並繼續處理收到的新消息(簡化代碼):

  def act {
    while (true) {
      receive {
        case (code: String) =>
          val codeMatch = future { match_code(code) }
          for (c <- codeMatch)
            yield callback(code)(JSON.parseJSON(c))
      }
    }
  }

  def match_code(code: String) {
     val result = s"my_script.sh $code" !!
  }

我注意到在jvisualvm和Eclipse Debugger時,該系統正在運行時,活動線程數一直在增加。 恐怕我遇到某種線程泄漏,但是我無法檢測出問題出在哪里。

這是完成線程和活動線程的一些屏幕截圖(我隱藏了一些與此問題無關的活動線程)

成品螺紋 成品螺紋

活動線程 活動線程

編輯1:在上面的圖形示例中,我僅使用3個不同類的actor運行系統:Actor1將消息發送到Actor2,然后將消息發送給Actor3

您使用的是receive因此每個actor都將使用其自己的線程,並且至少在此示例中,您沒有提供任何方法終止actor。 因此,您可能希望每個actor都有一個新線程已經啟動。 如果您看到的是那樣,那么一切都按預期工作。 如果要使actor停止運行,則必須讓它們最終退出while循環,或在它們上調用sys.exit或類似方法。

(此外,在2.11版中,老式Scala演員被棄用,而Akka演員被棄用。)

您(在上面的代碼中)也沒有任何跡象表明未來是否真正完成。 如果期貨沒有完成,他們將繼續束縛線程。

暫無
暫無

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

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