Je dois faire un chèque, qui retourne true ou false, selon que le processus actuel a tout message dans sa boîte aux lettres dans Erlang. P>
3 Réponses :
Vous devriez être capable d'utiliser 0 code> pour le recevoir code> délai d'attente. Dans l'exemple ci-dessous, il essaiera d'obtenir un message hors de la file d'attente, s'il n'y en a aucun, il retournera l'atome false code>. 16> HasMessages = fun(Pid) ->
16> element(2, erlang:process_info(Pid, message_queue_len)) > 0
16> end.
#Fun<erl_eval.6.80247286>
17> HasMessages(self()).
false
18> self() ! test.
test
19> HasMessages(self()).
true
Désolé, mais votre réponse est fausse. Votre code gaspille un message et donc perturber l'exactitude de tout calcul.
En outre, il y a un avertissement que cela consommera le message.
Désolé, je sais qu'ils sont deux réponses, ce que je dis, c'est que malgré votre avertissement, cette fonction (la première) n'est toujours pas acceptable car elle gaste un message. Veuillez indiquer un cas d'utilisation dans lequel cette fonction ne perturbe pas le flux de messages normal et n'a aucun effet secondaire sur la file d'attente de messages de processus. À propos de la deuxième réponse, c'est une bonne chose, donc je vous conseille simplement de supprimer le premier.
Aussi pour la première réponse, vous pouvez toujours renvoyer le message à vous-même, si la commande de message n'est pas importante. Recevez M -> Soi ()! M, true après 0 -> Faux extrémité. Code>
+1 pour aroniststav. Mais toujours, je ne suis pas une solution acceptable. Je préfère toujours le processus process_info
Cela pourrait toujours perturber l'exactitude, car il change les messages de commande sont livrés (vous prenez le premier message et mettez-le à la fin).
En interne, il existe des moyens de tester s'il y a un message dans la boîte aux lettres de processus.
MAIS ATTENTION! Je ne pense pas que Erlang est destiné à être utilisé comme celui-là: p> compile: ERLC + de_asm HASMSG.S code>. P> < p> Le module halsg code> contient: p>
hasmsg / 0 code> renvoie un booléen s'il existe des messages dans la boîte aux lettres. LI>
peekmsg / 1 code> renvoie le message le plus ancien sans le supprimer. Renvoie son argument si la boîte aux lettres est vide. LI>
lastmsg / 1 code> renvoie le message le plus récent sans le supprimer. Renvoie son argument si la boîte aux lettres est vide. Li>
ul> p>
Je ne le ferais pas de cette façon, à moins que vous n'ayez de tendances suicidaires et d'amour assemblant piratage. Ces instructions ne sont pas définies et il n'y a aucune garantie qu'ils resteront. Je donne une manière légèrement plus propre ci-dessous.
@RVirding, je n'utiliserais jamais ce code. Je voulais seulement voir si c'était possible. Piratage à la limite. ;) Je dirais que son algorithme est totalement cassé, si on doit jeter un coup d'œil sur le message le plus récent ou le plus ancien de la boîte aux lettres ...
Vous pouvez utiliser le processus_info / 2 code> BIF pour accéder aux informations de processus, y compris la file d'attente de message. SO process_info(self(), messages) => {messages,MessageList}
Le problème plus large est de trouver le dernier message dans la boîte aux lettres du processus.