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
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.
Dowiedz się o actors.
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.
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ć:
Przynieś kawę!
- 1. Jak tworzyć wielowymiarowe wektory w Scali?
- 2. Linux, gniazda, nieblokujące połączenie
- 3. Metody podnoszenia wartości funkcji w Scali
- 4. Uzyskaj wartość funkcji metody instancji w Scali
- 5. Jak mogę uzyskać nieblokujące gniazdo connect()?
- 6. Jak zwrócisz Iterator w Scali?
- 7. Jak wydrukować mapę w Scali
- 8. Zeus + FactoryGirl :: Składnia :: Metody. Metoda niezdefiniowana `tworzyć”
- 9. Jak tworzyć statystyki dźwigni?
- 10. Semantyka abstrakcyjnych cech w Scali
- 11. Jak definiujesz pakiet-prywatną * cechę * w Scali?
- 12. Niejednoznaczny import w Scali
- 13. Jak tworzyć wyrażenia lambda dla funkcjonalny interfejs mający metody rodzajowe
- 14. Jak tworzyć obiekty za pomocą statycznej metody fabularnej?
- 15. Wyjątek w scali podczas definiowania własnej metody INN
- 16. Każda metoda "setera" wymaga metody "getter" w Scali?
- 17. Co to jest var odmienny od metody w Scali?
- 18. Czy warto tworzyć i ustawiać metody w OOP?
- 19. Jak używać prymitywów w Scali?
- 20. Jak klonować obiekty w Scali?
- 21. Jak zdefiniować zamówienie w Scali?
- 22. Jak używać synchronizacji w Scali?
- 23. Jak odczytać plik gzip'd w Scali
- 24. Jak tworzyć podtypy w Moose?
- 25. Jak tworzyć kategorie w Railsach
- 26. Jak tworzyć obiekty w Perlu?
- 27. Jak tworzyć asercje w R?
- 28. W python, w jaki sposób mogę wykonać nieblokujące wywołanie systemowe?
- 29. Jak działa zarządzanie pamięcią zamknięć w Scali?
- 30. Projektowanie z niezmiennością (w Scali)