Параллельное выполнение ряда функций для ответа на HTTP-запрос - PullRequest
0 голосов
/ 21 ноября 2011

Я экспериментировал с различными подходами к этому и хотел бы увидеть, что вы, ребята, считаете лучшим подходом к решению этой проблемы в Python.

По сути, у меня есть веб-сервис, который принимает запросы, предоставив один термин запроса, и продолжает выполнять серию вычислений параллельно с этим термином. Эти вычисления можно рассматривать как отдельные вызовы функций.

Идея состоит в том, что, как только поступает запрос, я вызываю функции асинхронно и удерживаю запрос до тех пор, пока не начнут поступать результаты.

Из моих исследований кажется, что использование библиотеки, подобной gevent , вероятно, лучший путь, хотя я все еще не совсем знаком с гринлетами. Кроме того, похоже, что для того, чтобы выполнить тот тип функциональности, который я ищу (для того, чтобы результаты отправлялись обратно клиенту через длинный запрос по мере их появления), мне нужно использовать специальный тип StreamServer, который это поддерживает. Сам ответ - это просто объекты JSON, которые могут быть прочитаны модулем JavaScript во внешнем интерфейсе, который, в свою очередь, обновит компонент пользовательского интерфейса, поскольку они отправляются обратно в браузер.

Каков наилучший подход к этому? Имеет ли смысл использовать что-то вроде gevent или это должно быть реализовано с помощью сопрограмм без помощи библиотеки? Я уверен, что это было сделано в прошлом многими людьми здесь, и я хотел собрать некоторые рекомендации.

Заранее большое спасибо, дайте мне знать, если вы хотите получить более подробную информацию, и я с нетерпением жду ваших предложений!

1 Ответ

0 голосов
/ 12 июня 2012

Если предположить, что "вычисления", о которых вы говорите, не связаны с процессором, gevent было бы здорово для такого рода вещей.Ваш обработчик запросов может выглядеть следующим образом:

def handle_request(request):
    ...
    pool = gevent.pool.Group()
    results = group.map(do_computation, input_data)
    return results

Если они связаны с процессором, вам нужно учитывать multiprocessing, так как Python в целом довольно плох, когдаэто касается задач, связанных с ЦП, в одном процессе операционной системы.

...