Написание сервера, который ставит задачи в очередь - PullRequest
0 голосов
/ 08 июня 2011

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

В настоящее времяЯ подошел к нему с помощью сервера сокетов TCP - однако я не уверен, как сделать так, чтобы из очереди одновременно выполнялся только один запрос?

Как я мог быВот как это выглядит:

Client1 -> (a) -> Server
Client2 -> (b) -> Server
Client3 -> (c) -> Server

Server makes queue |a, b, c|
Execute a first. Done? Tell Client 1
Execute b second. Done? Tell Client 2
Execute c third. Done? Tell Client 3

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

Ответы [ 2 ]

3 голосов
/ 08 июня 2011

Существует множество способов сделать это, но решение будет выглядеть примерно так:

Клиент -> Клиент-посредник (TCP-порт) <-> Сервер посредник -> (ServerQ) <- Процесс задачи </p>

Поток будет выглядеть следующим образом:

Процесс клиента:

  1. Клиент создает посредник клиента на сокете tcp.
  2. Отправляет всю необходимую информацию по порту.
  3. Сервер-посредник получает запрос
    1. Создает ответ Q для процесса задачи
    2. Размещает запрос наСервер Q (команда + responseQ)
  4. Ожидание ответа на responseQ
    1. Нет ответа после истечения времени ожидания X?
    2. После получения ответа прочитайте и отправьте ответ через порт tcp.

Процесс сервера:

  1. Считывает данные с сервера Q.
    1. Команда процессов
    2. Запись ответа на ответ Q

Вовлеченные компоненты

Клиент - Простойпроцесс, который отправляет запросы на выполнение задач.

Client-Mediator - создает соединение с процессом сервера.

Server-Mediator - принимает запрос клиента на обработку задачи, ставит в очередь задачи и ожидает ответа.

Task Process - читает из ServerQ и ожидает поступления задачи.

0 голосов
/ 11 июня 2011

Ладно, то, что сказал Никс, было правильно, но я не был уверен, как именно это сделать (мой вопрос заключался в том, как сделать это на самом деле)

Как выяснилось, мне пришлось запустить 2 потока: один из которых выполняется из очереди, а другой являлся основным обработчиком сервера. Обработчик сервера порождает потоки для каждого нового соединения, а клиент блокирует после отправки запроса / если запрос успешно поставлен в очередь. Это означает, что очередь должна быть поточно-ориентированной / защищенной семафором или мьютексом. В случае с python есть класс multiprocessing.Queue, который обрабатывает это для вас. Всякий раз, когда задача выполняется, поток выполнения выполняет notifyAll (), который заставляет все спящие потоки просыпаться и проверять, выполнена ли их запрошенная задача. Я использую условную переменную для этого.

...