8
votes

Quels types de types peuvent être envoyés sur un message Erlang?

Principalement je veux savoir si je peux envoyer une fonction dans un message dans une configuration d'erlang distribuée.

sur la machine 1: xxx

sur la machine 2: xxx

a-t-il de sens?


0 commentaires

3 Réponses :


6
votes

Vous pouvez envoyer n'importe quel terme Erlang valide. Bien que vous devez faire attention lorsque vous envoyez des amusants. Tout amusement référençant une fonction à l'intérieur d'un module a besoin de ce module sur le nœud cible pour fonctionner: xxx

dans cet exemple, io existe sur les deux nœuds et fonctionne envoyer une fonction de io comme amusant. Toutefois, myModule n'existe que sur le premier nœud et que le plaisir génère une exception undef lorsqu'il est appelé sur l'autre noeud.


2 commentaires

Qu'en est-il des fonctions anonymes?


Si par là, vous voulez dire des amusements anonymes, il a le même problème. C'est à dire. Le module où il est défini doit exister sur le nœud distant.



8
votes

ici est un article intéressant sur "Passage d'amusement à d'autres nœuds Erlang". Pour le reprendre brièvement:

[...] comme vous le savez peut-être, Erlang Distribution Fonctionne en envoyant le codage binaire de termes; et donc envoyer un plaisir est aussi essentiellement fait en le codant en utilisant erlang: term_to_binary / 1; en passant la binaire résultant à un autre nœud, et puis décoder à nouveau en utilisant erlang: binaire_to_therm / 1. [...] C'est assez évident pour la plupart des types de données; Mais comment ça va Travailler pour des objets de fonction?

Lorsque vous encodez un plaisir, ce qui est codé est juste une référence à la fonction, pas la fonction de mise en œuvre. [...]

[...] La définition de la fonction n'est pas transmise; Juste exactement d'informations pour recréer le plaisir à un autre nœud si le module est là.

[...] Si le module contenant le plaisir n'a pas encore été chargé et que le nœud cible fonctionne en mode interactif; Ensuite, le module est tenté de chargé à l'aide du mécanisme de chargement du module régulier (contenu dans le module error_handler); Et puis il essaie de voir si un amusement avec l'identifiant donné est disponible dans ledit module. Cependant, cela ne se produit que paresseusement lorsque vous essayez d'appliquer la fonction.

[...] Si vous n'essayez jamais d'appliquer la fonction, rien de mal n'arrive. Le plaisir peut être transmis à un autre noeud (qui a le module / amusement en question), puis tout le monde est heureux. Peut-être que le nœud cible a un module chargé dudit nom, mais peut-être dans une version différente; Ce qui serait alors très susceptible d'avoir une différence de somme de contrôle MD5 différente, alors vous obtenez l'erreur BadFun si vous essayez de l'appliquer.

Je vous suggérerais de lire tout l'article, car c'est extrêmement intéressant.


0 commentaires

4
votes

Quant aux fonctions anonymes, il semble qu'ils puissent être envoyés et travailler comme prévu.

T1 @ localhost: xxx

t2 @ localhost: < PRE> XXX

Je ajoute une couverture logique à une application construite sur Riak-Core, et la fusion des résultats recueillis peut être délicate si les fonctions anonymes ne peuvent pas être utilisées dans des messages. < / p>

Consultez également riak_kv / src / riak_kv_coverage_filter.erl < / p>

riak_kv peut l'utiliser sur filtre résultat, je suppose.


0 commentaires