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

Julia HTTP服务器运行时如何重新加载代码?,julia,Julia,当使用http.service启动http服务器时,显然无法重新加载实际处理http请求的代码。 在下面的示例中,我希望在不必重新启动服务器的情况下考虑我的\u httphandler中的修改。 目前,我需要通过按CTRL+C两次从REPL停止服务器,然后再次运行脚本 有解决办法吗 module MyModule using HTTP using Mux using JSON using Sockets function my_httphandler(req::HTTP.Request)

当使用http.service启动http服务器时,显然无法重新加载实际处理http请求的代码。 在下面的示例中,我希望在不必重新启动服务器的情况下考虑我的\u 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

我不确定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

允许您在实时会话中自动更新代码。您可能对
entr
特别感兴趣;有关详细信息,请参阅Review的文档。

使用HTTP.jl时:只需在HTTP.service之前添加@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)
我已经向HTTP.jl项目添加了一个票证,用于开发人员工作流支持。我不确定这是否是您的用例

# 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)

更稳健的解决方案将捕捉错误;但是,要使其正常工作,我遇到了一些挑战,并在in
revisive.jl

中报告了我的经验,但是一旦http服务器启动,如何定义这个新的处理程序呢?我想我的问题相当于“如何让julia在不重新启动会话和http服务器的情况下考虑代码中的更改?”。谢谢你,比尔!在HTTP.server(…)启动服务器之前,您可能需要使用@async启动服务器,如果问题是您没有获得命令提示符。在HTTP.server(…)之前添加@async将返回提示符,然后我可以重新运行所需的代码行,并且确实会考虑更改。谢谢备注:Mux在后台启动http服务器。
#!/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)