2010-07-15 20 views
5

Tôi đang cố gắng làm cho một diễn viên 'đi ngủ' chờ một tín hiệu khác của diễn viên. Tôi muốn làm điều gì đó như:Làm cách nào để khiến diễn viên scala 'chờ tín hiệu' nhưng không làm mất bất kỳ tin nhắn nào?

def act(){ 
    loop{ //Should I use loop here too?? 
     if(sleepy){ 
      react{ 
        //SLEEPING 
        case "Wake Up"=> sleepy=false; //just to breack the react 
      } 
     }else{ 
      react{ 
       //React to other messages 
      } 
     } 
    } 
} 

Bây giờ, điều gì sẽ xảy ra với các thông điệp khác khi diễn viên của tôi đang ngủ? họ có bị phân biệt không? Tôi không muốn mất chúng. Một cách tốt để khắc phục điều này là gì?

Trả lời

6

Bạn có thể sử dụng bảo vệ trên các trường hợp khác trong khối phản ứng, các thư chưa được đối sánh trong khối phản ứng được giữ trong hàng đợi thư của tác nhân. Hãy thận trọng rằng các diễn viên chắc chắn sẽ được "đánh thức" trước khi kích thước hàng đợi là quá mức.

Nếu tôi nhớ chính xác, bạn chỉ có thể có một khối phản ứng trong vòng lặp do thiết kế phản ứng.

val receiver = new Actor { 
    private var sleeping = true 

    def act { 
    loop { 
     react { 
     case "Wake Up"  => println("waking up"); sleeping = false 
     case x if ! sleeping => println("processing "+x) 
     } 
    } 
    } 
} 

receiver.start 

import Thread.sleep 

receiver ! "Message 1" 
sleep(2000L) 
receiver ! "Message 2" 
sleep(2000L) 
receiver ! "Wake Up" 
sleep(2000L) 
receiver ! "Message 3" 
sleep(2000L) 
receiver ! "Message 4" 

thức dậy xử lý tin nhắn 1 xử lý tin nhắn 2 xử lý tin nhắn 3 xử lý tin nhắn 4

6

Bạn có thể sử dụng một cơ chế tương tự như Don nhưng tận dụng hết các chức năng andThen cung cấp bởi Actor.Body:

def waitForSignal :() => Unit = react { case Signal(_) => } 

def processMessages :() => Unit = loop { 
    react { 
     case x => //process 
    } 
} 

def act() = waitForSignal andThen processMessages 

Lý do khai báo loại khai báo rõ ràng () => Unit là vì react không bao giờ chấm dứt bình thường (tức là nó trả về Nothing). Nothing nằm ở cuối hệ thống phân cấp loại và loại phụ hợp lệ của bất kỳ loại nào khác.

Tôi đang tận dụng chuyển đổi tiềm ẩn từ một số () => Unit đến lớp Body chứa phương thức andThen.

Các vấn đề liên quan