首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“handle_call”超时

“handle_call”超时
EN

Stack Overflow用户
提问于 2014-08-08 01:57:14
回答 1查看 2.2K关注 0票数 8

我正在从genserver中的handle函数调用长生不老药来添加电话号码获取表单客户端。但是一旦handle_call被调用,所有者进程就会崩溃,超时。请帮帮忙。

一个ETS是全局创建的,用于在调用以下任何指定函数之前插入已经存在的值。

代码语言:javascript
复制
def handle_info(message, state) do

    {a,b} = message
    phonenumber = b[:body] 
    add phonenumber
    {:noreply, state}
end

def add(phonenumber) do
    GenServer.call(__MODULE__, {:add, phonenumber})
end


def handle_call({:add, phonenumber}, from, state) do

    :ets.insert(:access_table, {:details, phonenumber})
    reply = {:ok, "Added #{phonenumber} to profile"}
    new_state = [{username} | state]
    {:reply, reply , new_state}
end

错误:

代码语言:javascript
复制
** When Server state == []
** Reason for termination == 
** {timeout,{gen_server,call,['Elixir.Bankrecord',{add,"346534543534"},5000]}}
** (EXIT from #PID<0.150.0>) exited in: :gen_server.call(Bankrecord, {:add, '346534543534'}, 5000)
** (EXIT) time out
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-08 02:24:51

您不能在调用中调用自己,就像在handle_info调用add中那样,后者在gen_server上执行回调。由于所有操作都是在gen_server中依次发生的,所以您最终会阻塞自己。解决方案应该是在模块上使用一个简单的私有add函数,并将handle_infohandle_call({:add委托给它。

代码语言:javascript
复制
def add(phonenumber) do
  GenServer.call(__MODULE__, {:add, phonenumber})
end

def handle_info({_, message}, state) do
  add_number message[:body]
  {:noreply, state}
end


def handle_call({:add, phonenumber}, from, state) do
  add_number phonenumber
  {:reply, {:ok, "Added #{phonenumber} to profile"} , [{username} | state]}
end

defp add_number(phonenumber) do
  :ets.insert(:access_table, {:details, phonenumber})
end
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25194994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档