【发布时间】:2016-05-23 20:41:53
【问题描述】:
我有一个名为 Tornado 的模块,它实现了一个 GenServer,我试图将它作为一个名称与模块本身名称不同的进程生成。
根据Elixir Docs,可以通过将原子作为参数来注册 GenServer 进程
children = [
worker(Tornado, [[], [name: :tornado_server]])
]
但是当我尝试调用一个函数时,我得到一个错误:
iex(2)> :tornado_server.send_requests
** (UndefinedFunctionError) undefined function :tornado_server.send_requests/1 (module :tornado_server is not available)
我也试过把:tornado_server改成TornadoServer
** (UndefinedFunctionError) undefined function TornadoServer.send_requests/1 (module TornadoServer is not available)
编辑
这里是龙卷风模块
defmodule Tornado do
use GenServer
# Public API
def start_link(state, opts \\ []) do
GenServer.start_link __MODULE__, state, opts
end
def send_requests(requests) do
GenServer.cast(self, {:send_requests, requests})
end
def get_responses do
GenServer.call(self, :get_responses )
end
# GenServer API
def init(state) do
# creaza 10 Ci
{ :ok, state }
end
def handle_cast({:send_requests, requests}, state) do
state = state ++ [{requests, "127.0.0.1\n"}]
{:noreply, state }
end
def handle_call(:get_responses, _from, state) do
{:reply, state, state}
end
end
这是启动它的主管:
defmodule TornadoSupervisor do
use Supervisor
def start_link do
Supervisor.start_link(__MODULE__,[])
end
def init([]) do
children = [
worker(Tornado, [[], [name: :tornado_server]])
]
supervise(children, strategy: :one_for_one)
end
end
基本上我想这样称呼它:
> TornadoSupervisor.start_link
> TornadoServer.send_requests some_requests_array
> TornadoServer.get_responses
稍后编辑 显然,如果我这样做,它会起作用
> GenServer.cast(TornadoServer, {:send_requests,requests})
> GenServer.call(TornadoServer, :get_responses )
但是我觉得这个语法太冗长了。
【问题讨论】:
标签: elixir erlang-otp gen-server