Как реализовать несколько неблокирующих считывателей ввода (bufio.NewReader (os.Stdin)) в программе? - PullRequest
0 голосов
/ 05 апреля 2019

Я кодирую p2p-вещи, используя golang. Пиры общаются через буферизованную stream. Используя этот поток, они могут читать и записывать данные из него через rw:

rw := bufio.NewReadWriter(bufio.NewReader(stream), bufio.NewWriter(stream))

rw содержит идентификатор отправителя и сообщение (и некоторый другой контент, который сейчас не важен).

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

go readWriteData(rw)

У этого readWriteData(rw) есть две задачи:

  1. читать входящие данные с rw
  2. обработать эти данные и отправить сообщение обратной связи также через rw

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

Пока все хорошо. Моя проблема вызвана тем, что эта программа go readWriteData(rw) содержит также два считывателя, которые считывают ввод с консоли / терминала:

reader := bufio.NewReader(os.Stdin)

Мне нужны эти читатели для второго задания, обработки данных и отправки сообщения обратной связи. Первый reader используется для начала разговора. В зависимости от того, что является входом от терминала, новое сообщение начинается. Это должно быть всегда открыто для всех узлов. Второй reader необходим для предоставления определенного ответа в терминале на данный запрос. В зависимости от ввода с терминала данные обрабатываются по-разному, и различные ответы отправляются через rw.

Этот тип связи запрос-ответ с использованием двух считывателей в программе не работает должным образом:

Например: Пользователь 1 начинает общение, набирая что-то в терминале и отправляя запрос. Пользователь 1 и 2 получают его немедленно (goroutine). И тут возникает проблема: оба получают данные в goroutine, и первый reader снова начинает ждать ввода. Но в этом случае мне нужен второй reader, чтобы ответить на запрос.

Следовательно, существует проблема, заключающаяся в том, что эти два reader блокируют поток внутри программы go readWriteData(rw). Как я могу решить это?

...