2009-08-15 5 views
3

A a pris un coup d'œil à http://erlang.org/doc/apps/inets/http_client.html et a trouvé ce qui suit:Comment obtenir l'identifiant de processus du processus appelant dans erlang?

Une requête asynchrone ordinaire. Le résultat sera envoyé au processus appelant sous la forme {http, {ReqestId, Result}}

     5 > {ok, RequestId} = 
     http:request(get, {"http://www.erlang.org", []}, [], [{sync, false}]). 
Dans ce cas, le processus appelant est le shell, nous recevons donc le résultat.

     6 > receive {http, {RequestId, Result}} -> ok after 500 -> error end. 
     ok 

http: request me passe un message après l'avoir appelé ainsi, mais comment connaît-il mon ID de processus? Pour autant que je comprenne, http: request doit faire "Pid! {Http, {RequestId, Result}" pour m'envoyer le résultat, mais où connait-il la valeur de Pid?

Répondre

6

Si vous regardez la définition de l'enregistrement #request {} (dans httpc_internal.hrl), vous verrez qu'il y a un champ appelé from. Il contient le pid de l'appelant; C'est ainsi que le serveur pourra envoyer un message à l'appelant plus tard. En regardant le code source du module http, vous verrez que votre appel atteindra finalement la fonction handle_request, où le champ from est défini sur self().

2

Vous n'avez pas - le processus appelant doit fournir son Pid s'il veut une réponse. Faire quelque chose comme

Server ! {self(), arguments} 

puis le premier élément du tuple est l'adresse de retour.

Questions connexes