【发布时间】:2016-09-01 16:56:22
【问题描述】:
应用程序工作简单。当它接收到请求时,它会生成 thread_listener 并将其循环 10 次并传递索引 (i)。 ndc_thread 获取此数据 (i) 并返回核心。 Core 正在循环等待来自线程的消息,当它接收到时,它会发送包含线程返回的消息的块。
问题是在执行 1..10 循环函数后,它会发送“End”块并关闭连接。 所以 curl http://localhost:4000 的输出是:“StartEnd” 期望的结果是:“Start12345678910End”
有没有办法保持连接打开并等待自定义超时或等待进程执行?
defmodule AlivePlug do
import Plug.Conn
def init(opts) do
opts
end
def call(conn, _opts) do
conn = send_chunked(conn, 200)
chunk(conn, "Start")
core_pid = spawn_link(fn -> core_listener(conn) end)
thread = spawn_link(fn -> thread_listener end)
1..10 |> Enum.each(fn i -> send thread, {core_pid, i} end)
chunk(conn, "End")
conn
end
defp core_listener(conn) do
receive do
{status, i} ->
_conn = chunk(conn, Integer.to_string(i))
core_listener(conn)
end
end
defp thread_listener do
receive do
{core_pid, i} ->
send core_pid, {:ok, i}
thread_listener
_ ->
thread_listener
end
end
end
这是有效的应用程序 只需运行并使用邮递员或 curl http://localhost:4000 https://github.com/programisti/keep-alive-elixir
【问题讨论】:
-
@Atomic_alarm 是否有关于 Elixir/Erlang 标签未配对的元决策?我只知道 Erlang,但这个问题所需的代码/知识在这里可以轻松互换,因此标记两者似乎是合理的。
-
@NathanielWaisbrot,我不确定。我不知道 Elixir,也无法理解问题的本质。由于问题的措辞只是 Elixir 而不是 Elixir/Erlang 我认为这个问题与 Erlang 无关。如果您愿意,可以在聊天中继续对话 - chat.stackoverflow.com/rooms/75358/erlang-otp 或原样返回 ;-)
标签: multithreading elixir