【问题标题】:How to pass parameter to a gen_server function?如何将参数传递给 gen_server 函数?
【发布时间】:2016-11-17 16:05:21
【问题描述】:

我有一个gen_server,每次调用increment() 函数时计数器都会递增。

-module(genserver).
-export([start_link/0, start/0, increment/0]).
-behaviour(gen_server).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).

init([]) ->
    {ok, "counter.txt"}.

start() ->
    gen_server:start({local, ?MODULE}, ?MODULE, [], []).

increment() ->
    gen_server:call(?MODULE, increment).

handle_call(increment, _From, File) ->
    Counter = case file:read_file(File) of
        {ok, Binary} -> binary_to_integer(Binary);
        {error, enoent} -> 0
    end,
    ok = file:write_file(File, integer_to_binary(Counter + 1)).

handle_cast(_Req, State) ->
    {noreply, State}.

handle_info(_Info, State) ->
    {noreply, State}.

terminate(_Reason, _State) ->
    ok.

code_change(_OldVsn, State, _Extra) ->
    {ok, State}.

这里是shell执行示例

Eshell V7.3  (abort with ^G)
1> c("C:/Users/guga.melkadze/Desktop/testgen"). 
{ok,testgen}
2> testgen:start().
{ok,<0.39.0>}
3> testgen:increment().
920
4> testgen:increment().
921
5> testgen:increment().
922

现在我每次调用genserver:increment() 方法时都需要发送一个参数。例如genserver:increment(someParameter)。我如何做到这一点?

【问题讨论】:

    标签: parameters erlang erlang-otp gen-server


    【解决方案1】:

    更改increment 函数以发送一个元组而不是一个原子:

    increment(N) ->
        gen_server:call(?MODULE, {increment, N}).
    

    并更新handle_call 子句以使用它:

    handle_call({increment, N}, _From, File) ->
        Counter = case file:read_file(File) of
            {ok, Binary} -> binary_to_integer(Binary);
            {error, enoent} -> 0
        end,
        ok = file:write_file(File, integer_to_binary(Counter + N)).
    

    请注意,您的 handle_call 函数不会返回 gen_server 行为所期望的值类型,因此此过程可能会在每次请求后崩溃。您应该在最后一行添加类似这样的内容:

    {reply, ok, File}.
    

    【讨论】:

    • 你帮了我很多,谢谢!
    猜你喜欢
    • 2015-10-30
    • 1970-01-01
    • 2013-01-27
    • 2021-08-15
    • 2016-05-20
    • 2020-02-09
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多