gpt4 book ai didi

elixir - 在分块模式下保持 Elixir Plug 连接打开

转载 作者:行者123 更新时间:2023-12-05 00:15:31 25 4
gpt4 key购买 nike

是否可以在分块状态下保持连接打开几秒钟?

在请求中,我创建了几个进程,假设需要 5 秒才能完成,之后我想通过 block 向客户端发送响应,但连接已关闭

我正在用 postman 测试这个,我有这个标题:

"Connection": "Keep-Alive", "Keep-Alive": "timeout=10000"

这是我最小化的应用程序,输出始终是“InitEnd”期望的结果是:“Init1234567789End”或类似这样的内容:

defmodule AlivePlug do
import Plug.Conn

def init(opts) do
opts
end

def call(conn, _opts) do
conn = send_chunked(conn, 200)
# send initial chunk
chunk(conn, "Init")

pid = start_thread
# create 10 async processes which does somthing for 5 seconds and then sends result via chunk
1..10
|> Enum.each(fn num ->
send pid, {conn, num}
end)

# send End as a symbol of last chunk
chunk(conn, "End")
conn
end

defp start_thread, do: spawn_link(fn -> thread_listener end)
defp thread_listener do
receive do
{conn, num} ->
:timer.sleep(5000)
# problem is here :(
# chunk returns {:error, :closed}
{:error, :closed} = chunk(conn, "#{num}")
thread_listener
_ ->
thread_listener
end
end
end

最佳答案

作为解决方法,我定期使用 conn

receive do
...
after 3000 ->
# avoid connection close.
# execute `chunk(conn, ".")` every 3000ms
chunk(conn, ".")
end

作为附加信息,chunk 的第二个参数不应为空字符串。

关于elixir - 在分块模式下保持 Elixir Plug 连接打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36203757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com