Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Go 1.21 akan menyertakan keupayaan untuk mengehoskan http melalui WebAssembly? bagaimana?

Adakah Go 1.21 akan menyertakan keupayaan untuk mengehoskan http melalui WebAssembly? bagaimana?

王林
王林ke hadapan
2024-02-09 23:20:251111semak imbas

Go 1.21 会包含通过 WebAssembly 托管 http 的功能吗?如何?

editor php Xiaoxin berbesar hati untuk menjawab soalan anda tentang sama ada Go 1.21 akan menyertakan keupayaan untuk mengehoskan HTTP melalui WebAssembly. Pada masa ini, versi Go 1.21 belum dikeluarkan secara rasmi, jadi kami tidak dapat menentukan ciri khususnya. Walau bagaimanapun, berdasarkan apa yang kami ketahui tentang bahasa Go, Go sangat tertumpu pada pembangunan WebAssembly dan pengaturcaraan rangkaian, jadi kemungkinan besar fungsi pengehosan HTTP melalui WebAssembly akan ditambah dalam versi akan datang. Ini akan menyediakan pembangun alat pembangunan web yang lebih fleksibel dan cekap. Kami mengesyorkan agar anda terus memberi perhatian kepada maklumat keluaran rasmi bahasa Go untuk mendapatkan kemas kini dan ciri terkini.

Kandungan soalan

Saya ingin mencuba pelayan http melalui pemasangan web semasa dalam perjalanan. Saya rasa go 1.20 tidak menyokong kompilasi go untuk pemasangan web di luar penyemak imbas, dan perpustakaan net/http tidak disertakan dalam tinygo.

Selepas membaca https://stackoverflow.com/a/76091829 (terima kasih kepada @tachyonicbytes) saya cuba menggunakan gotip 来完成此操作,但是每当我尝试启动服务器(或任何阻塞/等待功能)时,我都会收到错误: 致命错误:所有 goroutine 都在睡觉 - 死锁!. Saya cuba mengalihkan sesuatu ke dalam goroutine dengan fungsi await, tetapi itu sama ada hanya menamatkan fungsi atau memberikan ralat yang sama. Begini cara saya menjalankannya:

go install golang.org/dl/gotip@latest
gotip download
goos=wasip1 goarch=wasm gotip build -o server.wasm server.go && wasm3 server.wasm

Ini adalah contoh server.go:

package main

import (
    "fmt"
    "net/http"
    "sync"
)

func main() {
    s := http.Server{
        Addr: ":8080",
        Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            w.Write([]byte("Hello, World!"))
        }),
    }

    fmt.Println("about to serve")
    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        err := s.ListenAndServe()
        if err != nil {
            fmt.Printf("Unable to serve: %v\n", err)
        }
        wg.Done()
        fmt.Println("serving stopped")
    }()
    wg.Wait()
    fmt.Println("started up server")
}

Jadi, adakah ini hanya kerana go 1.21 ialah wip, kerana saya tidak dapat memahami cara yang betul untuk memulakan fungsi menyekat, atau kerana go 1.21 tidak menyokong perkara sedemikian?

Saya cuba memulakan pelayan go di sisi pelayan webassembly runner wasm3 pada intel mac. Saya menjangkakan ia akan menyediakan perkhidmatan http, tetapi mendapati ia sama ada melemparkan ralat atau keluar serta-merta.

Penyelesaian

Sukacita membantu!

Malangnya ia tidak kelihatan seperti rangkaian wasm akan menjadi sebahagian daripada go 1.21. Melaksanakan rangkaian dalam wasm agak rumit. Menjalankan kod anda, saya mendapat baris ini:

sdk/gotip/src/net/net_fake.go:229

Selepas Pemeriksaan, ia mempunyai penafian berikut:

// Fake networking for js/wasm and wasip1/wasm.
// This file only exists to make the compiler happy.

Kesukarannya wasi hanya menyediakan sebahagian sokongan untuk soket, jadi wasi belum mempunyai soket berkeley yang lengkap.

Berita baiknya ialah anda sebenarnya boleh melakukan http, tetapi dalam tinygo. tinygo menyediakan sokongan separa untuk pakej perjalanan net/http dengan pemandunya.

Jika anda ingin melihat beberapa kegunaan praktikalnya, saya sedang cuba mengalihkan ini menggunakan projek tinygo ke wasm. Jika saya ingat dengan betul, saya telah berjaya melakukannya, tetapi sudah agak lama dan saya pasti saya belum menyelesaikan penukaran lagi. Mungkin tidak mungkin buat masa ini.

Seperkara lagi ialah wasm3 Walaupun terdapat pelaksanaan separa wasi, bahagian soket mungkin tidak dilaksanakan. Saya mengesyorkan menggunakan beberapa masa jalan lain juga, seperti wasmtime, wasmer, wasmedge atau wazero seperti yang dicadangkan @gedw99. wasmedge mempunyai sokongan yang hebat untuk soket, tetapi dalam kes anda pengkompil sebenarnya adalah masalahnya.

Atas ialah kandungan terperinci Adakah Go 1.21 akan menyertakan keupayaan untuk mengehoskan http melalui WebAssembly? bagaimana?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam