【问题标题】:Inducing a Julia Task to finish诱导 Julia 任务完成
【发布时间】:2021-01-26 14:14:50
【问题描述】:

我有一个应用程序,其中有一个中间人函数,它在 Julia Channel 上监听数据并立即将数据写入 HTTP.WebSocket 对象。在 websocket 的另一端有某种客户端,假设它是在浏览器中运行的 JavaScript。我创建了一个绑定到中间人函数的Task 对象。例如,我希望客户端关闭 websocket,并让该操作导致 Task 完成。这是我的中间人的样子:

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——但Task 的状态仍然是:runnable。您会注意到我目前忽略了客户端 (_ = readavailable(ws)) 发送的消息的内容。我已经进行了一些检查特殊值(例如“完成”)的试验,但这种方法没有比让客户端关闭 websocket 更好的运气了。

【问题讨论】:

    标签: http websocket julia


    【解决方案1】:

    我发现从网络任务外部终止任务的唯一方法是发送中断异常。例如,我想将ReviseMux 一起使用,而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 的东西。我还没准备好放弃那个梦想:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多