为什么不是golang WSGI实现

时间:2013-12-25 10:44:05

标签: go wsgi

我们在Python中有并发问题。这些WSGI服务器无法正常工作。我环顾四周,没有像Golang写的WSGI服务器及其goroutines一样。

有什么理由吗?

3 个答案:

答案 0 :(得分:26)

WSGI协议特定于Python。使用Go,您有三个选项(实际上,有四个选项,但普通CGI应该不适用于中等到高负载设置):

    Go的标准库的
  • Built-in HTTP serving facilities

    在这种情况下,您的应用是独立服务器。这可能是最简单的设置,但可能存在以下问题:

    • 要与降级权限(你的必须的做到这一点),在一个特权端口号上运行你的应用程序(1024以下,而80是在此范围内),你需要使用专门的包装或POSIX功能。
    • 为了在不丢失连接的情况下提供优雅的重新部署,您需要另一个包装器(如goagain)。
  • 与上述相同,但在Web服务器形式的反向HTTP代理后面。

    主要消除了独立变体的问题,但仍然有来回传递完整HTTP流量的开销。

  • FastCGI通过合适的网络服务器。 NginxApache(以及其他许多人)对此感到满意。 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。

相关问题