Zakładam, że wiadomości zostaną odebrane i przetworzone w sposób bezpieczny dla wątków. Jednak czytałem (niektóre) dokumenty akka/scala, ale nie spotkałem jeszcze słowa kluczowego "threadsafe".Aktorzy (scala/akka): czy zakłada się, że metoda odbioru będzie dostępna w sposób bezpieczny dla wątków?
Odpowiedz
Jest tak prawdopodobnie dlatego, że model aktora zakłada, że każda instancja aktora przetwarza sekwencyjnie swoją skrzynkę pocztową. Oznacza to, że nigdy nie powinno się zdarzyć, że dwa lub więcej współbieżnych wątków wykonuje kod instancji pojedynczego aktora. Technicznie możesz stworzyć metodę w klasie aktora (ponieważ wciąż jest to obiekt) i jednocześnie wywoływać ją z wielu wątków, ale byłoby to poważne odejście od reguł użycia aktora i zrobiłbyś to "na własne ryzyko", ponieważ wtedy straciłbyś wszystkie gwarancje bezpieczeństwa tego modelu.
Jest to również jeden z powodów, dla których Akka wprowadziła pojęcie ActorRef - uchwyt, który pozwala komunikować się z aktorem poprzez przekazywanie wiadomości, ale nie poprzez bezpośrednie wywoływanie jego metod.
Myślę, że mamy go dość dobrze udokumentowane: http://doc.akka.io/docs/akka/2.3.9/general/jmm.html
Przeczytałem ten dokument wiele razy. Jestem nowicjuszem JVM; w moim rozumieniu "dzieje się wcześniej" tylko uzasadnia "widoczność". Nadal możemy mieć problemy z powodu wielu wątków w sekcji krytycznej. –
Akka zabezpiecza przed uruchomieniem wiadomości dla tego samego aktora w tym samym czasie, dopuszczając tylko jeden raz do zaplanowania wykonania skrzynki pocztowej. (albo to jest zaplanowane do wykonania, albo nie jest). Uruchamiając skrzynkę pocztową, nie tylko unikamy przydzielania nowych runnables, ale możemy również, poprzez prostą operację CAS, zapewnić, że skrzynka pocztowa jest kiedykolwiek zaplanowana do wykonania tylko raz, co oznacza, że nie jest wymagane dodatkowe księgowanie, aby upewnić się, że 2 wątki nie przetwarzają tej samej skrzynki pocztowej w tym samym czasie. –
Niesamowite wytłumaczenie. To na pewno pomoże mi w dalszym czytaniu. Jedno pytanie, jak mogłem wydedukować "wzajemnie wyłączne przetwarzanie" skrzynki pocztowej z http://akka.io/docs/akka/1.2/general/jmm.html? –
Aktorzy są 'Treadsafe'. The Actor System (AKKA), zapewnia każdemu aktorowi swoją "lekką nić". Oznacza to, że nie jest to bieżnik, ale system AKKA sprawi wrażenie, że aktor zawsze działa w swoim wątku dla programisty. Oznacza to, że wszelkie operacje wykonywane w wyniku działania na wiadomości są dla wszystkich celów bezpieczne.
Nie należy jednak podważać AKKA za pomocą komunikatów o zmiennym brzmieniu lub stanu publicznego. Jeśli rozwiniesz swoich aktorów, aby byli samodzielnymi jednostkami funkcjonalności, będą one bezpieczne dla wątków.
Zobacz także: http://doc.akka.io/docs/akka/2.3.12/general/actors.html#State
i http://doc.akka.io/docs/akka/2.3.12/general/jmm.html bardziej dogłębnego studium modelu pamięci AKKA i sposobu zarządzania kwestiami „bieżnik”.
- 1. Utwórz plik w sposób bezpieczny dla wątków
- 2. Czy ten kod jest bezpieczny dla wątków? Jak mogę sprawić, by był bezpieczny dla wątków?
- 3. Czy putStrLn jest bezpieczny dla wątków?
- 4. Czy loop.run_in_executor asyncio jest bezpieczny dla wątków?
- 5. Czy wątek jest bezpieczny dla wątków SLF4J?
- 6. Czy MongoCollection.forEach musi być bezpieczny dla wątków?
- 7. Czy metoda executeUpdate w Javie jest bezpieczna dla wątków?
- 8. Jak uzyskać dostęp do kontrolki C# WPF w sposób bezpieczny dla wątków?
- 9. Czy będzie dostępna edycja ekspresowa F #?
- 10. Pobieranie wątków (metoda dostępu)
- 11. Fabryka obiektów singleton: czy ten kod jest bezpieczny dla wątków?
- 12. Czy .NET Socket Send()/Receive() jest bezpieczny dla wątków?
- 13. Czy inl_aton firmy Perl jest bezpieczny dla wątków?
- 14. Bezpieczny dla wątków HashSet z kolekcjami Guava
- 15. Czy wątek TransactionTemplate i SimpleJdbcTemplate jest bezpieczny dla wątków?
- 16. Jak zwiększać (dodawać wartość) w systemie dziesiętnym w sposób bezpieczny dla wątków?
- 17. Jak utworzyć bezpieczny dla wątków bufor/POD?
- 18. Czy ciąg odbierania/ustawiania wątków jest bezpieczny?
- 19. Powody, dla których Hibernate's sessionFactory jest bezpieczny dla wątków
- 20. Czy bezpieczny wątek SecureRandom jest bezpieczny?
- 21. Dlaczego ten kod nie jest bezpieczny dla wątków?
- 22. Stosować aktorzy w sztuce
- 23. Jak przekierować wyjście programu konsoli do pola tekstowego w sposób bezpieczny dla wątków?
- 24. Tworzenie DOM, który jest bezpieczny dla wątków dla operacji odczytu
- 25. Czy można oczekiwać tego samego zadania z wielu wątków - czy oczekuje się na wątek bezpieczny?
- 26. Można bezpiecznie zwiększyć BigInteger w sposób bezpieczny dla wątków, być może z AtomicReference, bez blokady?
- 27. Co to jest wątek ByteArrayOutputStream bezpieczny dla wątków?
- 28. Czy prywatna metoda Ruby jest dostępna w podklasie?
- 29. Bezpieczny dla wątków, ale szybki dostęp do "ostatecznej" zmiennej?
- 30. Czy oczekujesz, że reszta metody będzie asynchroniczna?
Dzięki Przemek. To wyjaśnia. –