我想使用{receiver,Receiver}和{sync,false}进行异步httpc post请求.Receiver可以是pid()但我想将它用作带有1个参数的函数,该参数接收一个id我可以提取pid()。我不能在这里使用pid(),因为如果重新启动进程但是id保持不变,pid()可能会改变。如果有人能给我一个如何使用接收器作为功能的例子。这将是一个很大的帮助。
答案 0 :(得分:0)
在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).
答案 1 :(得分:0)
我想当你调用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死)或者创建崩溃(进程尚未注册)。
在我看来,你希望从过低的错误中恢复过来,造成无用的复杂性。