2010-12-28 3 views
1

Ich habe ein kleines Problem mit Scala Actors und IO blockiert. Ich benutze einen Akteur, der selbst einen anonymen Akteur hat, der einen Eingabestrom verbraucht. Das Problem ist, dass dieser Stream nur eine Zeile liest und dann blockt, ohne wieder aufzuwachen. Was mich verwirrt ist, dass es funktioniert hat, als der Konsum in der Akt-Methode stattfand (Zufall?). Die Anwendung selbst hat einige mehr Akteure und Java-Threads, die etwas Arbeit machen.[Scala]: Problem mit Schauspielern und Blockieren von IO

Meine Frage ist: Was ist die übliche Praxis, um solche Probleme zu vermeiden? Irgendwelche Zeiger?

Der Code, der dieses Problem verursacht sieht etwas wie folgt aus:

object TestActor extends Actor { 

    private val instream = actor { 
    loop { 
     try { 
     println(processInput(input.readLine)) //bufferedinputstream. blocks, no wakeup 
     } catch { 
     case e: Exception => 
      println(e.toString) 
     } 
    } 
    } 


    def act(): Unit = { 
    react { 
     ... 
     case _ => {} 
    } 
    } 
} 

Grüße, raichoo

+1

Warum verwenden Sie einen Actor anstelle eines Java-Threads? Sie nutzen keine der akteursspezifischen Funktionen und möchten, dass sie immer ausgeführt wird. Genau das tut ein Thread. Überschreibe einfach die run-Methode und setze deinen try-Block dort hinein. –

+1

Woher bekommst du alles? Wo wird "Eingabe" deklariert? Wem gehört "processInput"? Bei Actors handelt es sich um eine Verhaltensreaktion auf _messages_. In Ihrem Beispiel werden keine Nachrichten angezeigt. –

+0

Ich war offensichtlich so sehr darauf aus, Schauspieler dafür zu benutzen, dass ich das Offensichtliche hier nicht sah. Danke, dass Sie mich wieder auf den richtigen Weg gebracht haben. – raichoo

Antwort

0

Frage wurde von Viktor in einem Kommentar beantwortet.

1

Der Aufruf von readline Looping ist {} so, es wird immer und immer wieder, bis es blockiert passieren .