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