簡體   English   中英

在Azure Service Fabric actor中啟動線程?

[英]Start a thread inside an Azure Service Fabric actor?

我知道Service Fabric中的參與者是單線程的。 但是,假設我在actor方法中啟動了一個新線程,那么會發生什么? 即使生成的線程仍在執行,actor也會被停用嗎?

根據文檔 ,當actor一段時間未“使用”時,它會被停用。 在這種情況下,“已使用”是指:

  • 接聽電話
  • IRemindable.ReceiveReminderAsync被調用

因此,似乎沒有考慮我啟動的新線程。 但是也許有人可以確認這一點?

演員只是對象。

Actor將被停用 ,並且可以用於垃圾回收。

操作系統中的實際線程(運行時)將一直運行,直到它們完成或終止。 可以收集它們的托管表示形式,但這不會影響實際線程。

而且,不會以任何方式跟蹤Actor內部產生的線程,因此您有責任自己管理它們的生命周期。

究竟。

當您啟動一個新線程時,原始線程(actor)將繼續運行並超出范圍,而跨接線程將繼續運行。 看看會發生什么:

當一個actor收到一個調用時,處理此調用的線程將使用SemaphoreSlim來獲取一個鎖來處理actor對象,如果另一個線程已經獲取了該鎖,則當前線程將等待其釋放,以便一旦釋放就可以繼續。

一旦獲得了鎖,線程將執行並從調用的方法中返回,然后他們釋放鎖以使下一個線程繼續。

當您將新線程作為actor邏輯的一部分進行擴展時,它將僅作為服務進程的一部分運行,但是這里的問題是,一旦離開方法范圍,就不再可以控制該線程了,但是將繼續運行,並且對於actor運行時任務已完成,下一個actor調用將創建另一個線程,並且一切將繼續進行。

該問題將在以下情況下開始:

  • 您無法控制正在運行的線程數,您的服務將開始消耗過多的內存,並且SF可能會嘗試在各個實例之間平衡actor \\ service,因為它不知道這些線程,如果它移動actor服務,所有您的線程將被中止,並且您將放棄這些操作。
  • 先前調用的跨接線程將與新線程競爭下一個actor調用。
  • 如果新線程同時使用actor數據繼續執行其他操作,則跨接線程和actor線程將面臨並發問題,在沒有例外發生的情況下,您將具有無法輕松調查的奇怪行為。 例如,一個線程正在更改值,而另一個線程正在使用它。
  • 還有您可能會遇到的許多其他並發問題

在可能(需要)另一個線程的情況下,您可以:

  • 創建另一個演員來處理任務
  • 在隊列中創建消息以供其他服務處理
  • 作為參與者調用的一部分來執行任務。

暫無
暫無

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

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