我有一个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)
。我该如何实现?
更改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}.
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句