Производительность: асинхронный обработчик запросов с задачами блокировки, выполняемыми пулом работников

Какова производительность этого скрипта: http://tornadogists.org/2185380/, скопированная ниже.

from time import sleep from tornado.httpserver import HTTPServer from tornado.ioloop import IOLoop from tornado.web import Application, asynchronous, RequestHandler from multiprocessing.pool import ThreadPool _workers = ThreadPool(10) def run_background(func, callback, args=(), kwds={}): def _callback(result): IOLoop.instance().add_callback(lambda: callback(result)) _workers.apply_async(func, args, kwds, _callback) # blocking task like querying to MySQL def blocking_task(n): sleep(n) return n class Handler(RequestHandler): @asynchronous def get(self): run_background(blocking_task, self.on_complete, (10,)) def on_complete(self, res): self.write("Test {0}<br/>".format(res)) self.finish() HTTPServer(Application([("/", Handler)],debug=True)).listen(8888) IOLoop.instance().start() 
  1. Мое приложение будет иметь более 1000 req / sec .
  2. Каждый запрос будет длиться от 2 до 30 секунд, в среднем около 6 секунд
    • Просто усреднение sleep(6)
  3. redis BLPOP IO, используя что-то вроде redis BLPOP или Queue.get_nowait()

One Solution collect form web for “Производительность: асинхронный обработчик запросов с задачами блокировки, выполняемыми пулом работников”

Общий шаблон в порядке, с оговоркой, что благодаря GIL ваш пул потоков сможет использовать только один процессор, и вам нужно будет использовать несколько процессов для полного использования доступного оборудования.

Более подробно посмотрите на цифры, 10 потоков слишком малы, если ваши запросы действительно будут составлять в среднем 6 секунд. Вы получаете 6000 секунд работы в каждую секунду, так что вам нужно в общей сложности по меньшей мере 6000 потоков во всех ваших процессах (и предполагается, что 6 секунд действительно блокируют внешние события и стоимость процессора в процессе python пренебрежимо мала). Я не уверен, сколько потоков может обрабатывать современная система, но 6000 потоков Python не звучат как отличная идея. Если у вас действительно есть 6 секунд блокировки для каждого запроса (и тысячи запросов / сек), похоже, было бы целесообразно преобразовать эти блокирующие функции в асинхронные.

Python - лучший язык программирования в мире.