Bagaimana cara memuat ulang kode ketika server HTTP sedang berjalan?

Saat memulai server http menggunakan HTTP.serve, tampaknya tidak ada cara untuk memuat ulang kode yang sebenarnya menangani permintaan HTTP. Pada contoh di bawah ini saya ingin modifikasi pada my_httphandler diperhitungkan tanpa harus me-restart server. Untuk saat ini saya perlu menghentikan server dari REPL dengan menekan CTRL+C dua kali dan kemudian menjalankan skrip lagi.

Apakah ada solusinya?

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

person tencnivel    schedule 27.05.2019    source sumber


Jawaban (4)


Saya tidak yakin apakah penangan cache Mux. Selama tidak, ini akan berhasil:

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
person Bill    schedule 27.05.2019
comment
Namun bagaimana Anda mendefinisikan penangan baru ini setelah server http dimulai? Saya kira pertanyaan saya setara dengan Bagaimana cara membuat julia memperhitungkan perubahan kode tanpa harus memulai ulang sesi dan server http?. Terima kasih Bill! - person tencnivel; 28.05.2019
comment
Anda mungkin perlu memulai server dengan @async sebelum HTTP.serve(...) memulai server, jika masalahnya adalah Anda tidak mendapatkan kembali command prompt. - person Bill; 28.05.2019
comment
Menambahkan @async sebelum HTTP.serve(...) memberi saya kembali prompt, saya kemudian dapat menjalankan kembali baris kode yang saya inginkan dan perubahannya memang diperhitungkan. Terima kasih!! Satu komentar: Mux memulai server http di latar belakang. - person tencnivel; 29.05.2019

Revise.jl memungkinkan Anda memperbarui kode secara otomatis dalam sesi Julia langsung. Anda mungkin tertarik secara khusus pada entr; lihat dokumentasi Revisi untuk detailnya.

person tholy    schedule 28.05.2019

Saat menggunakan HTTP.jl: tambahkan saja @async sebelum HTTP.serve

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

Saat menggunakan Mux.jl: tidak ada yang bisa dilakukan, server dimulai di latar belakang

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)
person tencnivel    schedule 29.05.2019

Saya telah menambahkan tiket #587 ke proyek HTTP.jl untuk alur kerja pengembang mendukung. Saya tidak yakin ini kasus penggunaan Anda atau bukan.

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

Alternatifnya, Anda dapat memiliki file test/serve.jl, yang mengasumsikan MyModule dengan router HTTP.jl tingkat atas disebut ROUTER. Anda harus menghapus panggilan ke serve di modul utama Anda.

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

Solusi yang lebih kuat akan menangkap kesalahan; namun, saya mengalami kesulitan dalam menjalankannya dan melaporkan pengalaman saya di #541 di Revise.jl.

person clarkevans    schedule 24.09.2020