2010-03-16 3 views
4

J'écris un petit serveur web à des fins de test en utilisant python, BasicHTTPServer et SimpleHTTPServer. Il semble qu'il traite une demande à la fois. Y a-t-il un moyen de le rendre un peu plus rapide sans trop bouger? Basicly mon code semble que ce qui suit et je voudrais garder ce simple;)BasicHTTPServer, SimpleHTTPServer et la concurrence

os.chdir(webroot) 
httpd = BaseHTTPServer.HTTPServer(("", port), SimpleHTTPServer.SimpleHTTPRequestHandler) 
print("Serving directory %s on port %i" %(webroot, port)) 
try: 
httpd.serve_forever() 
except KeyboardInterrupt: 
print("Server stopped.") 
+0

pourquoi ne pas utiliser tordu pour créer un HTTPServer? – anijhaw

Répondre

8

Vous pouvez faire votre propre filetage ou classe bifurquer avec l'héritage de mixin SocketServer:

import SocketServer 
import BaseHTTPServer 

class ThreadingHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): 
    pass 

Cela a ses limites car il n'utilise pas de pool de threads, est limité par le GIT, etc, mais cela pourrait aider un peu (avec relativement peu d'effort). Rappelez-vous que les requêtes seront servies simultanément par plusieurs threads, alors assurez-vous de verrouiller correctement les accès aux données globales/partagées (sauf si ces données sont immuables après le démarrage) effectuées au cours du traitement d'une requête.

This SO question couvre le même terrain (pas particulièrement long).

+0

Malheureusement, je suis bloqué sur 16 demandes par seconde - avec 1 demande simultanée ainsi qu'avec 10. – braindump

+1

@braindump, si vous êtes sous une forme quelconque d'Unix (fondamentalement tout sauf Windows), essayez un ForkingMixin au lieu du ThreadingMixin, cela pourrait vous servir mieux, esp. si vous utilisez un processeur multicœur Sinon, vous aurez vraiment besoin de passer à une sorte de serveur "réel" (Tornado, par exemple: voir http://www.tornadoweb.org/ - simple, et de très haute performance par http: //bret.appspot .com/entry/tornado-web-server). –

+0

Je suis sur Gentoo Linux sur un CPU ARM. Merci pour votre indice concernant Forking, c'est beaucoup mieux maintenant, même si ce n'est pas bon;) Mais pour mon intention, ça va. (Sur 10 requêtes simultanées, j'ai 60 requêtes par seconde, Lighttpd atteint ~ 400 requêtes par seconde sur la même machine) – braindump

0

En fonction de vos besoins, une autre option peut être de connecter Paste. Cependant, selon votre exemple, cela peut être exagéré. Quelque chose à garder dans la boîte à outils.

1

Vous pouvez également regarder CherryPy - c'est assez simple, aussi, et a plusieurs threads de demande sans effort supplémentaire. Bien que vos besoins puissent être modestes maintenant, le CP a beaucoup de fonctionnalités intéressantes qui pourraient vous être utiles à l'avenir.

+0

Êtes-vous sûr de la concurrence? Je ne peux pas le trouver dans leur documentation. – iwtu

Questions connexes