HTTP服务器运行时如何重新加载代码?

时间:2019-05-27 13:59:37

标签: julia

使用HTTP.serve启动http服务器时,显然无法重新加载实际上正在处理HTTP请求的代码。 在下面的示例中,我希望在my_httphandler中进行修改,而不必重新启动服务器。 目前,我需要通过两次按CTRL + C来从REPL停止服务器,然后再次运行脚本。

有解决方法吗?

module MyModule

using HTTP
using Mux
using JSON
using Sockets


function my_httphandler(req::HTTP.Request)    
    return HTTP.Response(200, "Hello world")
end

const MY_ROUTER = HTTP.Router()
HTTP.@register(MY_ROUTER, "GET", "/*", my_httphandler)


HTTP.serve(MY_ROUTER, Sockets.localhost, 8081)

end

4 个答案:

答案 0 :(得分:0)

我不确定Mux是否缓存处理程序。只要不行,就应该起作用:

module MyModule

using HTTP
using Mux
using JSON
using Sockets

function my_httphandler(req::HTTP.Request)    
    return HTTP.Response(200, "Hello world")
end

const functionref = Any[my_httphandler]

const MY_ROUTER = HTTP.Router()
HTTP.@register(MY_ROUTER, "GET", "/*", functionref[1])


HTTP.serve(MY_ROUTER, Sockets.localhost, 8081)

end


function newhandler(req::HTTP.Request)    
    return HTTP.Response(200, "Hello world 2")
end

MyModule.functionref[1] = newhandler

答案 1 :(得分:0)

Revise.jl使您可以在实时Julia会话中自动更新代码。您可能对entr尤其感兴趣;有关详细信息,请参见Revise的文档。

答案 2 :(得分:0)

使用HTTP.jl时:只需在HTTP.serve之前添加@async

module MyModule

using HTTP
using Sockets


function my_httphandler(req::HTTP.Request)    
    return HTTP.Response(200, "Hello world")
end

const MY_ROUTER = HTTP.Router()
HTTP.@register(MY_ROUTER, "GET", "/*", my_httphandler)


@async HTTP.serve(MY_ROUTER, Sockets.localhost, 8081)

end # module

使用Mux.jl时:无事可做,服务器在后台启动

using Mux

function sayhellotome(name)
  return("hello " * name * "!!!")
end

@app test = (
  Mux.defaults,

  route("/sayhello/:user", req -> begin
    sayhellotome(req[:params][:user])

  end),

  Mux.notfound())

Mux.serve(test, 8082)

答案 3 :(得分:0)

我已经为HTTP.jl项目添加了票证#587,以支持开发人员工作流。我不确定这是否是您的用例。

# hello.jl -- an example showing how Revise.jl works with HTTP.jl
# julia> using Revise; includet("hello.jl"); serve();

using HTTP
using Sockets

homepage(req::HTTP.Request) =
    HTTP.Response(200, "<html><body>Hello World!</body></html>")

const ROUTER = HTTP.Router()
HTTP.@register(ROUTER, "GET", "/", homepage)

serve() = HTTP.listen(request -> begin
                 Revise.revise()
                 Base.invokelatest(HTTP.handle, ROUTER, request)
          end, Sockets.localhost, 8080, verbose=true)

或者,您可能有一个test/serve.jl文件,该文件假定具有顶级MyModule路由器的HTTP.jl被称为ROUTER。您需要在主模块中删除对serve的调用。

#!/usr/bin/env julia
using HTTP
using Sockets
using Revise

using MyModule: ROUTER

HTTP.listen(request -> begin
       Revise.revise()
       Base.invokelatest(HTTP.handle, ROUTER, request)
end, Sockets.localhost, 8080, verbose=true)

更强大的解决方案将捕获错误;但是,在使它起作用方面我遇到了挑战,并在Revise.jl的{​​{3}}上报告了我的经验。