Latest posts on Маленькая скорость работы http-сервера, написаного на python topichttps://python.su/forum/topic/399/2007-01-27T12:29:58+02:00Веб-технологии :: Web :: Маленькая скорость работы http-сервера, написаного на python
2007-01-27T12:29:58+02:00bialix2746к теме про быстрые сервера, может будет интересно: <a href="http://softwaremaniacs.org/blog/2007/01/08/controlled-download-2/">http://softwaremaniacs.org/blog/2007/01/08/controlled-download-2/</a>
Веб-технологии :: Web :: Маленькая скорость работы http-сервера, написаного на python
2007-01-27T10:12:54+02:00j2a2744Ну отдача статики на python-powered-http не очень удачная затея. Если только не использовать что-нибудь типа <a href="http://cheeseshop.python.org/pypi/apricot">apricot</a>. Можно еще с <a href="http://twistedmatrix.com">twisted</a> посоревноваться.<br/><br/>А вот в вопросе запуска python-приложений все не так однозначно. У меня есть данные, что есть pure-python-решения, сравнимые по производительности с apache+mod_python и nginx/lighttpd+fastcgi.
Веб-технологии :: Web :: Маленькая скорость работы http-сервера, написаного на python
2007-01-27T05:31:10+02:00xonix2741Был слегка удивлен низкой скоростью работы сервера написанного на питоне (по крайней мере под виндой).. <br/>Возьмем для примера скрипт:<br/><br/><div class="code"><pre>import BaseHTTPServer<br/>import time<br/>from SocketServer import ThreadingMixIn<br/>tpl = """<html><br/><body><br/> <p><a href="/stop">stop it!</a></p><br/></body><br/></html>"""<br/><br/>class ThreadingHTTPServer(ThreadingMixIn, BaseHTTPServer.HTTPServer):<br/> pass<br/> <br/>class Handler(BaseHTTPServer.BaseHTTPRequestHandler):<br/><br/> def do_GET(self):<br/> global RUN<br/><br/> if self.path != "/":<br/> if self.path == "/stop":<br/> print "STOP!"<br/> self.send_response(200)<br/> self.send_header("Content-type", "text/html")<br/> self.end_headers()<br/> self.wfile.write("Server stopped")<br/> RUN = False<br/> return<br/> <br/> self.send_error(404, "File not found")<br/> return<br/> <br/> self.send_response(200)<br/> self.send_header("Content-type", "text/html")<br/> self.end_headers()<br/> self.wfile.write(tpl)<br/><br/> #time.sleep(1)<br/><br/><br/>class FBServer(ThreadingHTTPServer):<br/> def __init__(self, *a, **k):<br/> ThreadingHTTPServer.__init__(self, *a, **k)<br/> self.pathHandlers = {}<br/> <br/> def registerPathHandler(self, path, func):<br/> self.pathHandlers.append[path] = func<br/> <br/> <br/><br/><br/>PORT = 8000<br/>RUN = True<br/> <br/>httpd = ThreadingHTTPServer(("", PORT), Handler)<br/> <br/>print "serving at port", PORT<br/> <br/>while(RUN):<br/> httpd.handle_request()<br/> <br/>print "stop serving"</pre></div><br/>На самом деле я написал немного более другой скрипт, там я фактически реализовал http-сервер с нуля (используя только низкоуровневые модули типа socket, thread, threading).<br/>Короче парочка сравнительных тестов этого скрипта (скажу сразу, мой работает медленнее, что странно) с апачем (понимаю что звучит смешновато но все же…)<br/>Использовалась утилита ab (Apache Benchmark) из поставки апача<br/><br/>ab -n 900 -c 50 "<a href="http://127.0.0.1/fghfhfh">http://127.0.0.1/fghfhfh</a>" (тут запущен апач)<br/>результат:<br/>Server Software: Apache/2.0.59<br/>Requests per second: 800.00 (mean)<br/>Time per request: 62.500 (mean)<br/>Time per request: 1.250 (mean, across all concurrent requests)<br/><br/>ab -n 900 -c 50 "<a href="http://127.0.0.1:8000/fghfhfh">http://127.0.0.1:8000/fghfhfh</a>" (тут работает наш скрипт)<br/>результат:<br/>Server Software: BaseHTTP/0.3<br/>Requests per second: 20.85 (mean)<br/>Time per request: 2398.438 (mean)<br/>Time per request: 47.969 (mean, across all concurrent requests)<br/><br/>При этом когда ставим -с 1 (т.е. конкурентных соединений всего 1) то питон отрабатывает 100 запросов\сек, апач 116 запросов\сек<br/><br/>Заметил явственно следующие 2 закономерности:<br/>1) Питоновский скрипт никогда (за все время тестирования ab) не занимает более ~20% CPU-usage, обычно единицы процента, что мне показалось очень странным, при этом апач при большой конкурентности доходит до 100%. ПОЧЕМУ ТАК?<br/>2) Реальное число потоков скрипта очень мало 2-4 максимум десяток, при этом апач может дать 50 и более (наблюдалась колонка в Диспечере задач виндовс). ПОЧЕМУ ?<br/><br/>Конечно тут может последовать оговорка: не рекомендуется запускать для тестирования ab на одном компе с серваком. Но думается это слабо на что то влияет.<br/>Так ли плоха многопоточнось питона. Возможно это GIL (Global interpreter lock) так пагубно влияет? <br/><br/>Не ужели идея написания на питоне простого, быстрого, очень узкоспециализированного http-сервера обречена на провал?