Quels seraient de bonnes primitives en concurrence pour accéder à un objet lié à la CPU (sans IO et réseautage)?
Par exemple, il y a un FOOCOUNTER, qui a une méthode GET (), SET () et INC () pour Var Counter: Int, qui soit partagé entre des milliers et des millions de threads. P>
object FooCounter{ var counter: Int = 0; def get() = counter def set(value: Int) = {counter = counter + value} def inc() = counter + 1 }
6 Réponses :
Vous pouvez utiliser toutes les primitives de syntonisation Java, telles que AtomicInteger, par exemple pour compter.
Pour des tâches plus compliquées, j'ai personnellement comme Scala-STM Bibliothèque: http://nbronson.github.io/scala-stm/ p>
avec STM Votre exemple ressemblera à ceci p> Cependant, pour cet exemple simple, je m'arrêterais sur les primitives Java. P> P>
D'accord, je peux utiliser des primitives Java, mais mon objectif est d'utiliser des API Scala et apprenez-les. Merci d'avoir répondu.
BTW serait-il un bon choix de faire du comptoir immuable et de la définir avec un modèle CopyOnwrite?
Vous avez raison sur l'orientation "Akka" à Scala: dans l'ensemble, je pense qu'il y a un joli chevauchement de la communauté des développeurs de langue Scala et d'Akka. Les versions tardives de Scala s'appuient sur des acteurs Akka pour la concurrence, mais franchement, je ne peux pas voir une anithidification mauvaise dans cette situation. P>
En ce qui concerne votre question, Citez "Akka in Action" Book: P>
Les acteurs sont parfaits pour traiter de nombreux messages, capturant l'état et réagir avec différents comportements basés sur les messages qu'ils reçoivent " p> blockQuote>
et p>
"Les futures sont l'outil à utiliser lorsque vous préférez utiliser des fonctions et N'ayez pas vraiment besoin d'objets pour faire le travail " p> blockQuote>
Un avenir est un espace réservé pour une valeur non encore disponible, alors même s'il est utilisé pour des tâches non bloquantes, c'est utile pour plus de cela et je pense que cela pourrait être votre choix ici. P>
J'ai besoin de regarder Akka plus précisément. Ma compréhension de Akka est d'encombrer au cluster Akka, itinéraires pour cette tâche simple. Pourriez-vous s'il vous plaît élaborer comment l'avenir peut protéger ma valeur contre des milliers de threads?
Vous n'avez pas besoin de regrouper ou de routage si vous utilisez simplement des tâches simultanées dans le même JVM. C'est pourquoi akka-cluster code> et
AKKA-REMOTING code> sont des dépendances distinctes de la bibliothèque CORE
AKKA-acteur CODE>.
Une des solutions possibles de votre tâche est des acteurs. Ce n'est pas la solution la plus rapide mais sûre et simple:
Si vous n'êtes pas disposé à utiliser java.util.concurrent code> directement, votre solution la plus élégante peut utiliser AGENTS AKKA .
import java.util.concurrent.atomic.AtomicInteger
class FooCounter {
val counter = new AtomicInteger(0)
def get() = counter.get()
def set(v: Int) = counter.set(v)
def inc() = counter.incrementAndGet()
def modify(f: Int => Int) = {
var done = false
var oldVal: Int = 0
while (!done) {
oldVal = counter.get()
done = counter.compareAndSet(oldVal, f(oldVal))
}
}
}
Les agents des FYI sont obsolètes
Vous devez savoir que votre implémentation de Autres utilitaires de concurrence Scala, tels que contrats à terme et promesses, collections parallèles ou extensions réactives, ne sont pas le mieux adapté à la mise en œuvre d'un compteur simultané et ont des usages différents. P>
Vous devez savoir que Scala dans certains cas réutilise l'infrastructure de simultanéité Java. Par exemple, Scala ne fournit pas de variables atomiques à part, car les classes Atomiques Java font déjà le travail. Au lieu de cela, SCALA a pour objectif de fournir des abstractions de concurrence de niveau supérieur, telles que des acteurs, des STMS et des flux d'événements asynchrones. P>
Pour évaluer l'heure et l'efficacité de votre implémentation de votre implémentation, un bon choix est scalamètre . La documentation en ligne sur le site Web contient des exemples détaillés sur la manière de faire des analyses d'analyse comparative. P>
Pendant que AKKA est l'utilitaire de simultanécence scala le plus populaire et le plus documenté, il existe de nombreuses autres implémentations de haute qualité, dont certaines sont plus appropriées pour différentes tâches: P>
Je pense L'apprentissage de la programmation simultanée à Scala pourrait être une Bon livre pour vous. Il contient une documentation détaillée de différents styles de concurrence dans Scala, ainsi que sur les instructions sur le point de l'utiliser. Les chapitres 5 et 9 traitent également de la benchmarking.
Plus précisément, un utilitaire fort> compteur concomitable strong> est décrit, optimisé et rendu évolutif dans le chapitre 9 du livre. P>
Disclaimer: Je suis l'auteur. P> FOOCOUNTER CODE> n'est pas du thread-Safe. Si plusieurs threads invoquent simultanément le
get code>,
définir code> et
inc code> méthodes, il n'y a aucune garantie que le compte sera précis. Vous devez utiliser l'un des utilitaires suivants pour mettre en place un compteur concomitable correct: p>
Synchronisée code> instruction (SCALA
Synchronisée code> est similaire à la un en Java ) li>
Benchmarking h2>
Documentation et bibliothèques de concurrence H2>
Merci d'avoir répondu. J'ai déjà pré-commandé un livre. Au plaisir de lire quand il serait disponible.
java.util.concurrent.atomic.atomicinteger code> fonctionne très bien avec Scala, fait compter le threadsafe, et vous n'avez pas à mettre des dépendances supplémentaires dans votre projet. P>
Je n'ai pas vraiment eu le temps pour une réponse complète, mais vous avez raison que Akka n'est pas vraiment la bonne chose pour cela. Jetez un coup d'œil à nBonson.github.io/scala-stm - Il implémente la mémoire transactionnelle logicielle , qui fonctionne précisément pour ce scénario. Je pense que cela va être ajouté à la bibliothèque standard Scala.
"Des millions de threads" ... Bien sûr