A看了http://erlang.org/doc/apps/inets/http_client.html并找到了以下内容:
一个普通的异步请求.结果将发送到{http,{ReqestId,Result}}表单上的调用进程Run Code Online (Sandbox Code Playgroud) 在这种情况下,调用进程是shell,因此我们收到结果.5 > {ok, RequestId} = http:request(get, {"http://www.erlang.org", []}, [], [{sync, false}]).
Run Code Online (Sandbox Code Playgroud)6 > receive {http, {RequestId, Result}} -> ok after 500 -> error end. ok
http:request以这种方式调用后向我传递消息,但它如何知道我的进程ID?据我所知,http:request必须做"Pid!{http,{RequestId,Result}"才能将结果发送给我,但是它在哪里知道Pid的价值?
如果你看一下#request {}记录的定义(在httpc_internal.hrl中),你会看到有一个名为from的字段.它包含来电者的pid; 这就是服务器以后如何能够向呼叫者发送消息.
查看http模块的源代码,您将看到您的调用最终将到达handle_request函数,其中from字段设置为self().