【问题标题】: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 死)或造成崩溃(进程尚未注册)。

      在我看来,您正在寻求从错误中恢复的级别太低,从而造成无用的复杂性。

      【讨论】:

        猜你喜欢
        • 2015-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-21
        • 1970-01-01
        • 2021-08-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多