Http 引导Julia任务完成

Http 引导Julia任务完成,http,websocket,julia,Http,Websocket,Julia,我有一个应用程序,其中我有一个中间人函数,它在Julia频道上监听数据,并立即将数据写入HTTP.WebSocket对象。websocket的另一端有某种客户端,比如说它是在浏览器中运行的JavaScript。我创建了一个绑定到中间人函数的任务对象。我希望客户端关闭websocket,并让该操作导致任务完成。我的中间人是这样的: function listener(port::Int64, channel::Channel) HTTP.listen(Sockets.localhost,

我有一个应用程序,其中我有一个中间人函数,它在Julia
频道上监听数据,并立即将数据写入
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后能有直接的反应。我还没准备好放弃那个梦想:)。相关。。。