Потоковая или асинхронная обработка изображений?

1

У меня есть функция Python, которая генерирует изображение после его доступа. Я могу либо вызвать его непосредственно по HTTP-запросу, либо сделать это асинхронно с помощью Gearman. Есть много запросов.

Какой способ лучше:

  • Inline - создание встроенного изображения, приведет к созданию сразу нескольких изображений
  • Асинхронный - задания очереди (с Gearman) и генерация изображений в рабочем

Какой вариант лучше?

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

  • 0
    Это зависит от того, сколько времени занимает создание 1 изображения? Если это время мало, вы получите лучшие результаты обработки на той же машине.
  • 0
    Под «отдельным работником» вы подразумеваете отдельный процесс или отдельную машину? Обработка выполняется кодом Python, нативно скомпилированным модулем Python или чем-то еще? Ответы на эти вопросы влияют на эффективность, которую вы можете ожидать от различных вариантов.
Показать ещё 2 комментария
Теги:
asynchronous
gearman

2 ответа

1
Лучший ответ

У меня есть функция Python, которая генерирует изображение, когда оно доступ. Я могу либо вызвать его непосредственно по HTTP-запросу или сделать это асинхронно используя Gearman. Там есть много запросов.

Вы не должны делать это внутри запроса, потому что тогда вы не можете дросселировать (ваш сервер может перегрузить). Все крупные сайты используют очередь сообщений для обработки в автономном режиме.

Какой вариант лучше?

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

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


Я считаю, что процессы forking стоят дорого. Я бы создал пару рабочих процессов (возможно, немного порезался внутри процесса) для обработки нагрузки. Я бы использовал redis, потому что он быстро, активно развивается (antirez/pietern совершает почти каждый день) и имеет очень хорошую/стабильную клиентскую библиотеку python, blpop/rpush можно использовать для имитации очереди (задания)

1

Если ваша программа связана с ЦП в интерпретаторе, то размножение нескольких потоков фактически замедлит результат, даже если для их работы достаточно процессоров. Это происходит потому, что GIL (глобальная блокировка интерпретатора) позволяет только одному потоку запускаться в интерпретаторе за раз.

Если большая часть работы происходит в библиотеке C, вероятно, блокировка не удерживается, и вы можете продуктивно использовать несколько потоков.

Если вы сами порождаете темы, вам нужно будет не создавать слишком много - потоки 10K в одном случае будут плохими новостями - так что вам нужно будет настроить рабочую очередь, с которой потоки будут прочитаны, а не просто нереститься их в петлю.

Если бы я делал это, я бы просто использовал стандартный многопроцессорный модуль.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню