2013-12-25 3 views
11

У нас есть параллельные проблемы в Python. Эти серверы WSGI просто не работают так замечательно. Я смотрю вокруг, не получаю ничего, как Golang, написанный WSGI-сервер с его goroutines.Почему не реализация golang WSGI

Любые причины?

+0

WSGI - это спецификация для веб-серверов Python. –

+0

Просто не могу написать веб-сервер Python с Golang? – fengsp

+0

Что не работает для вас? Вы спрашиваете, почему сервер Go работает лучше, чем Python? – jwalker

ответ

22

WSGI протокол специфичен для Python. С Go у вас есть три варианта (на самом деле, четыре, но обычная CGI должны якобы быть не считается для умеренной до высокой нагрузки установок):

  • Built-in HTTP serving facilities стандартной библиотеки Go содержит.

    В этом случае ваше приложение является автономным сервером. Это может быть простая установка, но она может иметь следующие проблемы:

    • Чтобы запустить приложение с понижены привилегиями (вы должны сделать это) на привилегированном номер порта (ниже 1024, и 80 в этом диапазон) вам необходимо использовать специализированную оболочку или возможности POSIX.
    • Чтобы обеспечить изящные перераспределения без потери соединений, вам понадобится другая оболочка (например, goagain).
  • То же, что и выше, но за реверсом HTTP прокси-сервер в виде веб-сервера.

    В основном устраняет проблемы автономного варианта, но все еще имеет накладные расходы на полный оборот HTTP трафика взад и вперед.

  • FastCGI через подходящий веб-сервер. Nginx и Apache (и многие другие) в порядке с этим. FCGI клиент осуществление available in the Go standard library.

    В дополнение к отсутствию проблем с автономной настройкой, реализуется более эффективный протокол обмена данными. Еще один бонус заключается в том, что ваш сервер Go может взаимодействовать с интерфейсным веб-сервером, используя Unix-каналы, которые имеют меньшую стоимость передачи, чем TCP-сокеты, задействованные в обратном HTTP прокси-варианте.

Так что, если ваша установка в настоящее время использует WSGI, я бы сказал, что идти с FCGI.

+0

++ для полезного ответа, который выходит за рамки поставленного вопроса. – twotwotwo

+1

Вы основывали этот совет на тестах? Я предполагаю, что встроенный подход (через goagain) будет легко превосходить FastCGI, но я предпочел бы видеть цифры до принятия решения. На одном сайте Go HTTP является лидером по одному конкретному эталону (http://www.techempower.com/benchmarks/), недавно опередив предложения JVM. –

+1

@ Rick-777, нет, к сожалению, у меня нет жестких данных, чтобы поддержать мои претензии. Мое замечание о более эффективном протоколе обмена данными заключалось в сравнении «FastCGI» с обратным прокси-сервером «HTTP» - я согласен с вами в том, что автономный сервер должен быть самым быстрым из всех. – kostix

2

Хотя Go может не поддерживать протокол WSGI как таковой, uWSGI, который является довольно популярным сервером WSGIhas 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() 
} 
+1

uwsgi - это не то, во что вы верите. Я удивлен, что люди поддержали это. uwsgi - многоцелевой инструмент для запуска нескольких языков сценариев или скомпилированных языков. Он имеет мало общего с вопросом. Пример, который вы опубликовали, будет запускать программу go, используя uwsgi. Поэтому вместо 'http.ListenAndServe()' у вас есть uwsgi.Run(). uwsgi - это как адаптер, который позволяет подключать разные языки. WSGI - это протокол. uwsgi использует только буквы «wsgi». Это как сказать, что Бананы и Наны - то же самое, и если вам нужна няня, вы должны купить банан. Не смешивается –

+0

@dalu Перечитывая вопрос сейчас через 1,5 года, я вижу, что я неправильно понял вопрос. Я знаю, что такое uwsgi, и теперь я вижу, что OP действительно спрашивал, есть ли сервер WSGI, написанный в Go (который будет запускать приложения WSGI Python). – korylprince

0

Существует сервер Go WSGI здесь:

http://bitbucket.org/classroomsystems/wsgi

Однако его намерение состоит в том, чтобы не запускать серверы Python быстрее - он запускает один интерпретатор CPython с GIL. Я написал это, чтобы облегчить переход для моих клиентов, пока наш продукт перемещается с Python на Go.

Смежные вопросы