【问题标题】:Erlang asynchronous httpc post requestErlang 异步 httpc post 请求
【发布时间】:2014-11-15 11:52:34
【问题描述】:
我想使用 {receiver, Receiver} 和 {sync, false} 进行异步 httpc 发布请求。Receiver 可以是 pid() 但我想将其用作具有 1 个参数的函数,该参数接收一个 id我可以提取pid()。我不能在这里使用 pid(),因为如果进程重新启动,pid() 可以更改,但 id 保持不变。如果有人可以给我一个如何使用接收器作为函数的例子。这将是一个很大的帮助。
【问题讨论】:
标签:
asynchronous
erlang
httpclient
【解决方案1】:
在 Erlang 中,您可以使用 register/2 以某个名称注册进程。例如,您可以在启动处理程序进程时调用它:
register(post_handler, self()).
这样,您可以将新名称与! 运算符一起使用:
post_handler ! message.
所以你可以这样使用函数作为接收器:
Receiver = fun(ReplyInfo) -> post_handler ! ReplyInfo end.
request(post, Request, HTTPOptions, [{receiver, Receiver} | OtherOptions], Profile).
【解决方案2】:
我猜当你调用httpc:request/4的时候,你知道你要使用的Id,以及获取对应pid的函数,所以你只需要在调用httpc:request/4之前创建一个匿名函数:
IdRequest = createIdRequest(Request),
ReceiverFunc = fun(ReplyInfo) -> getPid(IdRequest) ! {http,ReplyInfo} end,
httpc:request(Method, Request, HTTPOptions,[{sync, false},{receiver,ReceiverFunc}|Opts]).
如果您担心接收进程死亡并重新启动(使用新的 pid)请注意,如果接收进程不存在(或尚未注册),这样做(或使用已注册的进程)仍会留出一些时间窗口. getPid 函数应该处理这个问题,并且无论如何发送的消息仍然可能丢失(pid 死)或造成崩溃(进程尚未注册)。
在我看来,您正在寻求从错误中恢复的级别太低,从而造成无用的复杂性。