Потоковая или асинхронная обработка изображений? - PullRequest
1 голос
/ 30 января 2011

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 31 января 2011

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

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

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

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

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


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

1 голос
/ 30 января 2011

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

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

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

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

...