Maison  >  Article  >  développement back-end  >  Go 1.21 inclura-t-il la possibilité d'héberger http via WebAssembly ? comment ?

Go 1.21 inclura-t-il la possibilité d'héberger http via WebAssembly ? comment ?

王林
王林avant
2024-02-09 23:20:251111parcourir

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

L'éditeur php Xiaoxin est heureux de répondre à votre question de savoir si Go 1.21 inclura la possibilité d'héberger HTTP via WebAssembly. Actuellement, la version Go 1.21 n’a pas été officiellement publiée, nous ne pouvons donc pas déterminer ses fonctionnalités spécifiques. Cependant, d'après ce que nous savons du langage Go, Go est très axé sur le développement de WebAssembly et la programmation réseau, il est donc très probable que la fonction d'hébergement HTTP via WebAssembly soit ajoutée dans une future version. Cela fournira aux développeurs des outils de développement Web plus flexibles et plus efficaces. Nous vous recommandons de continuer à prêter attention aux informations de version officielle du langage Go pour obtenir les dernières mises à jour et fonctionnalités.

Contenu de la question

Je souhaite essayer le serveur http via webassembly en déplacement. Je pense que go 1.20 ne prend pas en charge la compilation de go pour l'assemblage Web en dehors du navigateur, et la bibliothèque net/http n'est pas incluse dans tinygo.

Après avoir lu https://stackoverflow.com/a/76091829 (merci à @tachyonicbytes) j'ai essayé d'utiliser gotip 来完成此操作,但是每当我尝试启动服务器(或任何阻塞/等待功能)时,我都会收到错误: 致命错误:所有 goroutine 都在睡觉 - 死锁!. J'ai essayé de déplacer des éléments dans une goroutine avec une fonction d'attente, mais cela termine simplement la fonction ou donne la même erreur. Voici comment je le gère :

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

Ceci est un exemple 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")
}

Alors, est-ce simplement parce que go 1.21 est un wip, parce que je ne comprends pas la bonne façon de lancer une fonction de blocage, ou parce que go 1.21 ne prend pas en charge une telle chose ?

J'essaie de démarrer un serveur Go dans le runner webassembly côté serveur wasm3 sur un Mac Intel. Je m'attendais à ce qu'il fournisse un service http, mais j'ai constaté qu'il provoquait une erreur ou se terminait immédiatement.

Solution

Heureux de vous aider !

Malheureusement, il ne semble pas que wasm networking fera partie de go 1.21. La mise en œuvre du réseau dans wasm est un peu compliquée. En exécutant votre code, j'ai obtenu cette ligne :

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

Après Inspection, il comporte l'avertissement suivant :

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

La difficulté est que wasi ne fournit qu'un support partiel pour les sockets, donc wasi n'a pas encore de socket Berkeley complet.

La bonne nouvelle est que vous pouvez réellement faire du http, mais en tinygo. tinygo fournit un support partiel pour le package go net/http avec son driver.

Si vous voulez en voir quelques utilisations pratiques, j'essaie actuellement de porter ce en utilisant le projet tinygo vers wasm. Si je me souviens bien, cela fonctionne, mais cela fait un moment et je suis sûr que je n'ai pas encore terminé la conversion. Ce n'est peut-être pas possible pour le moment.

Une autre chose est wasm3 Bien qu'il existe une implémentation partielle de wasi, la partie socket peut ne pas être implémentée. Je recommande également d'utiliser d'autres environnements d'exécution, tels que wasmtime, wasmer, wasmedge ou wazero, comme l'a suggéré @gedw99. wasmedge offre un excellent support pour les sockets, mais dans votre cas, le compilateur est en fait le problème.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer