【问题标题】:Is there any State variable in Mochiweb?Mochiweb 中是否有任何状态变量?
【发布时间】:2012-08-27 09:10:03
【问题描述】:

我浏览了Mochiweb code,但没有找到任何状态变量的迹象。

Mochiweb 中是否存在类似于 gen_server 的 State 变量的东西?

我需要在服务器上存储少量与状态相关的服务器端(非会话相关)数据,我不想为此使用 ETS 或 Mnesia。

【问题讨论】:

  • 请求完成后是否需要保持状态?

标签: erlang state erlang-otp mochiweb gen-server


【解决方案1】:

我认为您对什么是 gen_server 状态有些误解。

首先,让我简要解释一下 mochiweb 的工作原理。

Mochiweb 不会为每个客户端生成一个 gen_server 进程。相反,它只是使用proc_lib:spawn/3 生成一个新进程并创建一个参数化模块,它基本上是以下类型的元组:

{mochiweb_request, #Port<0.623>, get, "/users", {1, 1}, []}

这是

{mochiweb_request, Socket, Method, RawPath, HTTPVersion, Headers}

此元组用作函数的参数,您将其作为循环参数传递给mochiweb_http:start/1。所以,当这个“循环”函数被调用时,它会是这样的:

handle_request(Req) ->
    %% The pattern matching below just shows what Req really is
    {mochiweb_request, _, _, _, _, _} = Req,
    ...

现在,解释 gen_server 状态。

基本上,gen_server 是一个大致如下结构的进程。当然,IRL 更复杂,但这应该会给你一个大致的思路:

init(Options)
    State = ...
    loop(Module, State).

loop(Module, State)
    NewState = receive
        {call, Msg, From} -> Module:handle_call(Msg, From, State)
        {cast, Msg} -> Module:handle_cast(Msg, State)
        Info -> Module:handle_info(Info, State)
    end,
    loop(Module, NewState).

因此,状态只是一个参数,您可以在所有函数调用中拖动并在循环内进行更改。实际上,您的进程是否是 gen_server 并不重要,它没有生命周期。在以下示例中,术语 [1, 2, 3] 也是一个状态:

a() ->
    b([1, 2, 3], now()).

b(State, Timestamp) ->
    Result = do_something(Timestamp)
    c(State, Result).

c(State, Payload) ->
    exit({State, Payload}).

现在,回到 mochiweb。

如果您需要创建自己的状态,您可以添加一个额外的函数参数:

handle_request(Req) ->
    User = Req:get(path),
    UserData = load_user_data(User),
    handle_request(Req, UserData).

handle_request(Req, UserData) ->
    ...

现在 UserData 也是一个状态。您可以循环此过程,或者让它响应并立即结束 - 但只要您将 UserData 作为参数传递,您就不会丢失它。

最后,如果你真的想让这个进程成为 gen_server(这在大多数情况下确实不合理),你可以使用 gen_server:enter_loop/3 函数将你当前的进程变成一个 gen_server。这个函数的第三个参数将是你的状态,它将存储在启动的 gen_server 中。

【讨论】:

    猜你喜欢
    • 2019-11-05
    • 1970-01-01
    • 2011-04-19
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 2010-11-09
    相关资源
    最近更新 更多