2009-09-04 12 views
5

Jaki jest dobry sposób tworzenia nieblokujących metod w Scali? Jednym ze sposobów, w jaki mogę myśleć jest stworzenie wątku/aktora, a metoda po prostu wysyła wiadomość do wątku i zwraca. Czy istnieje lepszy sposób tworzenia nieblokującej metody?Jak tworzyć nieblokujące metody w Scali?

Odpowiedz

13

Zastosowanie scala.actors.Future:

import actors._ 

def asyncify[A, B](f: A => B): A => Future[B] = (a => Futures.future(f(a))) 

// normally blocks when called 
def sleepFor(seconds: Int) = { 
    Thread.sleep(seconds * 1000) 
    seconds 
} 

val asyncSleepFor = asyncify(sleepFor) 
val future = asyncSleepFor(5) // now it does NOT block 
println("waiting...")   // prints "waiting..." rightaway 
println("future returns %d".format(future())) // prints "future returns 5" after 5 seconds 

Przeciążone „asyncify”, który wykonuje funkcję z więcej niż jednego parametru pozostawiamy jako ćwiczenie.

Jednym zastrzeżeniem jest jednak obsługa wyjątków. Funkcja, która jest "asyncyfikowana", musi sama sobie poradzić ze wszystkimi wyjątkami, łapiąc je. Zachowanie wyjątków wyrzuconych z funkcji jest niezdefiniowane.

2

To zależy od definicji "blokowania". Ściśle mówiąc, wszystko, co wymaga zdobycia zamka, blokuje się. Wszystkie operacje, które są zależne od wewnętrznego stanu aktora, zyskują blokadę aktora. Obejmuje to wysyłanie wiadomości. Jeśli wiele wątków spróbuje wysłać wiadomość do aktora, wszystkie muszą być w jednej linii.

Jeśli naprawdę nie potrzebujesz blokowania, w java.util.concurrent dostępne są różne opcje.

Biorąc to pod uwagę, z praktycznego punktu widzenia aktorzy dają ci coś wystarczająco bliskiego, aby nie blokować, ponieważ żadna ze zsynchronizowanych operacji nie wykonuje znacznej ilości pracy, więc istnieje szansa, że ​​aktorzy spełnią twoje potrzeby.

1

Mam bardzo dokładne wyjaśnienie na moim blogu na temat przyszłości. W rzeczywistości pokazuje on, w jaki sposób można samemu zrealizować przyszłość, a co za tym idzie, bardzo dobrze rozumie temat. Proponuję, aby ją przeczytać:

http://vigtig.it/blog/?p=73

Przynieś kawę!