2011-10-02 2 views
1

Я занимаюсь изучением BaseHTTPServer и обнаружил, что это не так хорошо для нескольких запросов. Я прошел через эту статью http://metachris.org/2011/01/scaling-python-servers-with-worker-processes-and-socket-duplication/#pythonPython HTTP Server доступен для нескольких запросов

, и я хотел бы знать, что это лучший способ для создания HTTP-сервера для нескольких запросов ->

Моих требований к HTTP Server прост - - поддерживают множественные запросы (где каждый запрос может запустить LONG Python скрипт)

До сих пор я следующие варианты -> - BaseHTTPServer (с резьбой не хорошо) - mod_python (Apache Интеграция) - CherryPy? - Любые другие?

ответ

1

Действительно, HTTP-серверы, снабженные стандартной библиотекой python, предназначены только для легкого использования; Для умеренного масштабирования (100 одновременных подключений) mod_wsgi в apache - отличный выбор.

Если ваши потребности превышают это (10 000 одновременных подключений), вам нужно посмотреть асинхронную структуру, такую ​​как Twisted или Tornado. Общая структура асинхронного приложения совсем другая, поэтому, если вы считаете, что вам, вероятно, придется сходить по этому маршруту, вы обязательно должны начать свой проект в одной из этих фреймворков с самого начала.

2

У меня было очень хорошее удачи с веб-сервером CherryPy, одним из старейших и надежных веб-серверов с чистым Python. Просто напишите свое приложение в качестве WSGI, и его следует легко запускать на многопоточном сервере CherryPy.

http://www.cherrypy.org/

1

Tornado действительно хороший и простой в использовании асинхронных событий с обратной связью/веб-сервер, разработанный FriendFeed/Facebook. У меня лично был очень хороший опыт. Вы можете использовать классы HTTP, как в приведенном ниже примере, или только io-loop для мультиплексирования простых TCP-соединений.

import tornado.ioloop 
import tornado.web 

class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
     self.write("Hello, world") 

application = tornado.web.Application([ 
    (r"/", MainHandler), 
]) 

if __name__ == "__main__": 
    application.listen(8888) 
    tornado.ioloop.IOLoop.current().start()