2012-09-30 202 views
0

Scala中有什麼方法可以在循環中執行某些操作而不會阻塞整個流?非阻塞scala循環

我有下面的代碼在Actor模型傳遞的東西

所有參與者發送的東西其他演員:

def some_method 
    loop { 
    // Transmit something 
    Thread.sleep(100) 
} 

我也有一些代碼,以接收其他演員送什麼。但是流程並沒有從循環中走出來。它睡覺並繼續而不會從循環中出來。因此,所有演員都繼續發送,但沒有人收到。我怎樣才能解決這個問題?

+0

將該方法重構爲actor? –

回答

1

如果我正確理解你,你希望傳輸每100ms發生一次,但你不想爲此創建另一個線程(並且演員內部的Thread.sleep實際上可能會阻止該流)。 您可以使用reactWithin

import java.util.Date 
import math.max 

def some_method = { 
    var last_transmission_time = 0 
    loop { 
     val current_time = (new Date).getTime 
     reactWithin(max(0, last_transmission_time + 100 - current_time)) { 
      // actor reaction cases 

      case TIMEOUT => { 
       // Transmit something 
       last_transmission_time = (new Date).getTime 
      } 
     } 
    } 
} 

last_transmission_time保存最後一次傳輸已完成。 計算反應超時值,以便在當前時間爲最後傳輸時間+ 100ms時發生TIMEOUT。

如果發生超時,則意味着自上次傳輸以來超過100ms,因此應該調用另一次傳輸。

如果反應案件本身可能需要很長時間,那麼我看不到任何簡單的解決方案,但創建另一個線程。

我沒有嘗試代碼,因爲我不確定是否完全理解您的問題。