我们在Python中有并发问题。这些WSGI服务器无法正常工作。我环顾四周,没有像Golang写的WSGI服务器及其goroutines一样。
有什么理由吗?
答案 0 :(得分:26)
WSGI
协议特定于Python。使用Go,您有三个选项(实际上,有四个选项,但普通CGI
应该不适用于中等到高负载设置):
Built-in HTTP
serving facilities。
在这种情况下,您的应用是独立服务器。这可能是最简单的设置,但可能存在以下问题:
goagain
)。与上述相同,但在Web服务器形式的反向HTTP
代理后面。
主要消除了独立变体的问题,但仍然有来回传递完整HTTP
流量的开销。
FastCGI
通过合适的网络服务器。 Nginx
和Apache
(以及其他许多人)对此感到满意。 FCGI
客户端实施是available in the Go standard library。
除了没有独立设置的问题外,还实现了更高效的数据交换协议。另一个好处是,您的Go服务器可能使用Unix管道与前端Web服务器通信,该管道的传输成本低于反向HTTP
代理变体中涉及的TCP套接字。
因此,如果您的设置目前使用WSGI
,我会说FCGI
。
答案 1 :(得分:2)
虽然Go可能不支持WSGI
协议本身uWSGI,这是一个非常受欢迎的WSGI
服务器has support for Go。目前看来支持是有限的而且不经常更新,但可能需要考虑。
默认情况下,uWSGI Go插件支持
http.DefaultServeMux
处理程序,因此如果您的应用程序已经基于它,那么在uWSGI中运行它应该非常简单。
以下示例改编自uWSGI文档:
package main
import (
"uwsgi"
"net/http"
"fmt"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "<h1>Hello, World!</h1>")
}
func main() {
http.HandleFunc("/hello/", helloHandler)
uwsgi.Run()
}
答案 2 :(得分:1)
这里有一个Go WSGI服务器:
http://bitbucket.org/classroomsystems/wsgi
但是,它的目的不是更快地运行Python服务器 - 它运行带有GIL的单个CPython解释器。我编写它是为了促进我的客户顺利过渡,同时我们的产品从Python转移到Go。