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

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

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

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

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

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

2 ответа

Решение

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

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

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

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

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


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

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

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

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

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

Другие вопросы по тегам