2016-01-11 3 views
0

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

Я пишу веб-сервис в качестве интерфейсного сервера TCP. Этот сервер прослушивает порт, который я ему предоставляю, и возвращает ответ на TCP-соединение для каждого запроса.

Вот почему я пишу веб-службу фронт-енд для этого сервера:

  • Сервер может обрабатывать один запрос в то время, и я пытаюсь сделать это иметь возможность обрабатывать несколько входов одновременно, путем запуска нескольких процессов и предоставления им другого порта для прослушивания. Например, я хочу запустить 30 экземпляров и сообщить им прослушивать порты 20000-20029.
  • Наша команда использует PHP, а PHP не имеет возможности запускать экземпляры сервера и поддерживать их одновременно, поэтому я пытаюсь написать API, на который они могут просто отправлять HTTP-запросы.

Итак, вот структура, о которой я думал.

  1. У меня будет функция main(). Эта функция запускает процессы одновременно, затем запускает HTTP-сервер на порту 80 и слушает.
  2. У меня есть http.Handler, который добавляет содержимое запроса на канал.
  3. У меня будут gorutines, по одному на каждый экземпляр сервера, которые находятся в бесконечном цикле.

код для функции, указанной в пункте три будет что-то вроде этого:

func handleRequest(queue chan string) { 
    for { 
     request := <-queue 
     conn, err := connectToServer() 
     err = sendRequestToServer(conn) 
     response, err := readResponseFromServer(conn) 
    } 
} 

Итак, мой http.Handler может просто сделать что-то вроде queue<- request, чтобы добавить запрос в очереди, и handleRequest, которые заблокировал, ожидая, что канал получит что-то, просто получит запрос и продолжит работу. Когда закончите, цикл завершается, выполнение возвращается к request := <-queue, и то же самое продолжается.

Моя проблема начинается с сообщения http.Handler. Имеет смысл отправлять запросы в канал, потому что многие гориты слушают его. Однако, как эти гортины могут вернуть результат моему http.Handler?

Один из способов - использовать канал, назовем его responseQueue, что все эти языки будут писать. Проблема в том, что когда ответ добавляется в канал, я не знаю, к какому запросу он принадлежит. Другими словами, когда несколько запросов отправляют http.Handler, каждый исполняющий обработчик не будет знать, к какому ответу относится текущее сообщение на канале.

Есть ли лучшая практика или шаблон для отправки данных в горутин из другого гортана и получения данных обратно?

+0

Это имеет смысл. Можете ли вы добавить его в качестве ответа, чтобы я мог принять его? –

ответ

1

Создайте канал ответа на запрос и включите его в значение, отправленное работнику. Обработчик получает от канала. Рабочий отправляет результат на канал.

Смежные вопросы