Question

Puis-je définir la taille maximale de la boîte aux lettres d'un acteur dans Scala?

Prenons le problème du producteur-consommateur. Avec les threads, je peux bloquer les producteurs lorsque le tampon est plein. J'ai vu quelques exemples de producteurs-consommateurs écrits en scala et ils utilisent tous des acteurs avec des boîtes aux lettres utilisées comme "tampon". Puis-je définir la taille de la boîte aux lettres pour que les producteurs attendent que le consommateur soit prêt? Toute autre solution élégante pour éviter une croissance incontrôlable des boîtes aux lettres?

Était-ce utile?

La solution

Vous pouvez créer un acteur jouant le rôle de tampon entre le producteur et le consommateur. La mémoire tampon extrait sa boîte aux lettres de ses données de boucle. Il renvoie une "surcharge". message au producteur lorsque le nombre de produits tamponnés est trop élevé; et envoie un " effacer " message une fois que tout est rentré dans l'ordre. S'il y a trop de messages, les messages entrants (ou les plus anciens) sont tout simplement supprimés.

Le consommateur demande activement des produits à partir de la mémoire tampon, qui à son tour renvoie un produit. Si la mémoire tampon est vide, le consommateur continue d'attendre l'entrée.

Le producteur envoie les produits à l’acteur tampon. Si elle reçoit une "surcharge" message, il peut arrêter la production ou continuer à produire, sachant que les produits risquent de tomber.

Bien sûr, cette logique pourrait être directement implémentée dans le producteur ou le consommateur lui-même, mais un tampon séparé vous permettra d’introduire plus facilement plusieurs producteurs et / ou consommateurs.

Autres conseils

La méthode Actor.mailboxSize renvoie le nombre de messages en attente dans la boîte aux lettres de l'acteur.

Ceci peut être utilisé pour étrangler le producteur de différentes manières.

Par exemple, une possibilité pourrait être,

Le producteur vérifie si le mailboxSize du consommateur est supérieur à un seuil. Si tel est le cas, il envoie un SpecialMessage au consommateur et le bloque sur un sémaphore. Lorsque le consommateur reçoit ce SpecialMessage , il libère le sémaphore. Le producteur peut maintenant continuer joyeusement ses affaires.

Cela évite les interrogations ainsi que les messages abandonnés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top