python web server multiprocessing tornado

Servidor web Python tornado: cómo usar el multiprocesamiento para acelerar la aplicación web



server multiprocessing (1)

Tengo una aplicación web que funciona bien cuando la usa un usuario, pero a medida que más clientes la usan, es insoportablemente lenta. El lado del servidor está escrito en python y usa tornado. Noté que mientras el servidor en el que se ejecuta tiene 4 núcleos, solo se usa uno, así que comencé a analizar el multiproceso de Python. He visto el ejemplo básico de: http://sebastianraschka.com/Articles/2014_multiprocessing_intro.html y los procesadores de tornado de: http://tornado.readthedocs.org/en/latest/_modules/tornado/process.html ( que parece un poco más complicado), pero todavía no estoy seguro de que esto sea lo que estoy buscando. ¿Funcionará este código con 4 procesadores para acelerarlo cuando digamos que 50 usuarios lo están viendo a la vez? ¿Y si es así, una de estas opciones es el camino a seguir para la implementación al usar el servidor web tornado?

Perdón por la pregunta vaga y mal escrita: mi falta de experiencia con el multiprocesamiento es la culpable de esto, incluso después de una extensa investigación. Si algún código de ejemplo te ayudará a responder esta pregunta, házmelo saber.

¡Gracias!


Puede ejecutar varios trabajadores de tornado con un código como este:

import tornado.web import tornado.httpserver import tornado.ioloop class MyHandler(tornado.web.RequestHandler): @tornado.web.asynchronous def get(self): self.write(''OK'') self.finish() if __name__==''__main__'': app = tornado.web.Application([(r''/'', MyHandler)]) server = tornado.httpserver.HTTPServer(app) server.bind(8888) server.start(4) # Specify number of subprocesses tornado.ioloop.IOLoop.current().start()

Aunque es bastante extraño que su aplicación tenga problemas para atender a 50 usuarios, incluso en un solo núcleo. ¿Tiene algunos cálculos pesados ​​allí, o usa alguna libs de bloqueo?

Asegúrese de utilizar @tornado.web.asynchronous o @tornado.gen.coroutine en sus métodos de manejo, de lo contrario, solo está ejecutando su código de forma sincrónica.

ACTUALIZACIÓN: para hacer el trabajo pesado en un proceso separado, puede usar concurrent.futures.ProcessPoolExecutor . Mire esta respuesta: https://.com/a/25208213/1525432 .