У меня есть функция python (ну, теперь это PHP, но мы переписываем), которая принимает некоторые параметры (A и B) и вычисляет некоторые результаты (находит лучший путь от A до B в графе, граф доступен только для чтения) , в типичном сценарии один вызов занимает от 0,1 до 0,9 с. Эта функция доступна пользователям как простой веб-сервис REST (GET bestpath.php? From = A & to = B). Текущая реализация довольно глупа - это простой скрипт php + apache + mod_php + APC, каждый запрос должен загружать все данные (более 12 МБ в массивах php), создавать все структуры, вычислять путь и выходить. Я хочу изменить его.Как обрабатывать длительные запросы в python-работниках?
Я хочу установить с N независимых работников (X на сервер с серверами Y), каждый рабочий является приложением python, работающим в цикле (получение запроса -> обработка -> отправка ответа -> получение req ...) каждый рабочий может обрабатывать один запрос за раз. Мне нужно что-то, что будет действовать как интерфейс: получать запросы от пользователей, управлять очередью запросов (с настраиваемым таймаутом) и кормить моих работников по одному запросу за раз.
Как подойти к этому? можете ли вы предложить некоторые настройки? nginx + fcgi или wsgi или что-то еще? HAproxy? как вы можете видеть, что я новичок в python, обратный прокси и т. д. Мне просто нужна начальная точка архитектуры (и потока данных)
кстати. работники используют данные только для чтения, поэтому нет необходимости поддерживать блокировку и связь между ними.
многопроцессорность выглядит нормально, но, честно говоря, мне не нужны все функции (связь, синхронизация и т. Д.), Мои работники независимы и с этой настройкой мне нужен интерфейс на каждом сервере, не так ли? я думал о внедрении базового анализа http (или что-то еще, я не знаю, какой другой протокол может использоваться между рабочим и revproxy) в рабочем месте, и пусть некоторый обратный прокси запрашивает обработку через пул серверов (рабочие порождаются на в начале), но я не знаю, имеет ли этот подход смысл и с чего начать (какой revproxy, как реализовать рабочий <-> revproxy и т. д.) – winter
Вам не нужна синхронизация, кроме как для связи, но вам нужна коммуникация (от задач от внешнего интерфейса до рабочих, результатов от рабочих до интерфейса - нет, вам определенно НЕ нужен интерфейс на сервер, почему вы думаете, что ?!) и Queue, предоставленная многопроцессорной обработкой, отлично подходит для этого , освобождая вас от беспокойства по поводу протоколов, проксирования и еще чего-то - я думаю, что направление, к которому вы стремитесь, может запутать вас в настоящий беспорядок работы, в то время как многопроцессорность намного проще в использовании! –
ОК, но с многопроцессорной обработкой мне нужно написать 2 приложения: app1 - один интерфейс управления процессом, app2 - много рабочих процессов, не так ли? то: может ли app1 управлять app2 на разных машинах?является постоянным? я имею в виду - его код и данные остаются между запросами с веб-сервера? если нет - очередь потеряна, если да - она должна быть асинхронной, чтобы обрабатывать одновременные запросы. поэтому app1 в основном имитирует async webserver - его единственная цель - управлять очередью запросов. я бы хотел избежать дублирования функций, которые уже там усложняют. – winter