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

Какова производительность этого скрипта: 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 / Tornado - сжатие статических файлов
  • Как я могу сделать асинхронные операции mysql в торнадо с помощью Python3.4?
  • Невозможно вызвать результат () на фьючерсах в торнадо
  • Как я могу получить IP-адрес клиента запроса Tornado?
  • Как мне получить доступ к моим функциям уровня базы данных в других классах / файлах в Tornado?
  • Openshift Tornado WebSocket (Demo) не отвечает
  • Доступ к твиттеру с использованием tornado.httpclient с использованием прокси
  • проблема работает привет мир с веб-сервером торнадо (Python 2.5, Win 7)
  • Отправка двоичного файла в Tornado
  • Торнадо: Определить / отслеживать соединения веб-карт?
  • стандартный способ обработки сеанса пользователя в торнадо
  •  
    Interesting Posts for Van-Lav

    загрузка модулей с помощью imp.load_source с тем же именем, что приводит к слиянию модулей

    Как разрешить масштабирование с равномерным соотношением сторон в (Py) Qt?

    Очистка изображения captcha

    как вставить небольшое изображение на углу сюжета с помощью matplotlib?

    Интерпретация суммы баллов TF-IDF по документам

    Тестирование инструментария Google Analytics с помощью Python

    python + opencv – Как построить диапазон hsv?

    Создание Python с использованием неправильной версии GCC на OS X

    Как распечатать текущую конфигурацию ведения журнала, используемую модулем регистрации python?

    Flask: RESTful API и SocketIO Server

    AttributeError: модуль 'pandas' не имеет атрибута 'to_csv'

    Как Python может получать двоичные данные (char *) из C ++ by SWIG?

    Использование python pandas для анализа CSV с датой в формате Year, Day, Hour, Min, Sec

    Сравните словари, игнорируя определенные ключи

    Время жизни временных объектов в SWIP-пакетах Python (?)

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