Http 引导Julia任务完成
我有一个应用程序,其中我有一个中间人函数,它在JuliaHttp 引导Julia任务完成,http,websocket,julia,Http,Websocket,Julia,我有一个应用程序,其中我有一个中间人函数,它在Julia频道上监听数据,并立即将数据写入HTTP.WebSocket对象。websocket的另一端有某种客户端,比如说它是在浏览器中运行的JavaScript。我创建了一个绑定到中间人函数的任务对象。我希望客户端关闭websocket,并让该操作导致任务完成。我的中间人是这样的: function listener(port::Int64, channel::Channel) HTTP.listen(Sockets.localhost,
频道上监听数据,并立即将数据写入HTTP.WebSocket
对象。websocket的另一端有某种客户端,比如说它是在浏览器中运行的JavaScript。我创建了一个绑定到中间人函数的任务
对象。我希望客户端关闭websocket,并让该操作导致任务完成。我的中间人是这样的:
function listener(port::Int64, channel::Channel)
HTTP.listen(Sockets.localhost, port) do http::HTTP.Stream
if HTTP.WebSockets.is_upgrade(http.message)
HTTP.WebSockets.upgrade(http, binary=true) do ws
try
while !eof(ws)
_ = readavailable(ws)
bytes = take!(channel)
write(ws, bytes)
end
catch err
if isa(err, InvalidStateException)
@info "Channel for $port is closed, exiting"
end
end
end
end
end
end
我看到的是listener()
对关闭websocket做出反应-它捕获了InvalidStateException
-但是任务的状态保持为:runnable
。您会注意到,我当前忽略了客户端发送的消息的内容(\uu=readavailable(ws)
)。我做过一些检查特殊值的实验(例如“done”),但这种方法没有比让客户端关闭websocket更好的运气。我发现从网络任务外部终止任务的唯一方法是发送中断异常。例如,我想对Mux
使用revisive
,并且Mux
不会正确地重新映射任何函数或lambda,除非我重新启动Mux
。我不想关闭julia,我只想重新启动Mux.serve
任务
global MUX_SERVER_TASK = nothing
function revise_mux_routes(port=8080)
# println("Revise works!")
global MUX_SERVER_TASK
if !isnothing(MUX_SERVER_TASK)
@async Base.throwto(MUX_SERVER_TASK, InterruptException())
while !(istaskdone(MUX_SERVER_TASK) || istaskfailed(MUX_SERVER_TASK))
yield()
end
println("killed MUX_SERVER_TASK")
@show MUX_SERVER_TASK
end
MUX_SERVER_TASK = Mux.serve(APP, port; stream=true, readtimeout=0)
@show MUX_SERVER_TASK
end
这类函数应该可以用于终止侦听任务。我一直在使用一种机制,该机制在任意睡眠间隔(模拟用户中断)后使用Base.throwto(task,InterruptException()),它确实有效。我希望客户关闭websocket后能有直接的反应。我还没准备好放弃那个梦想:)。相关。。。