Я кодирую p2p-вещи, используя golang. Пиры общаются через буферизованную stream
. Используя этот поток, они могут читать и записывать данные из него через rw
:
rw := bufio.NewReadWriter(bufio.NewReader(stream), bufio.NewWriter(stream))
rw
содержит идентификатор отправителя и сообщение (и некоторый другой контент, который сейчас не важен).
Чтобы система оставалась открытой, у меня есть программа, которая всегда прослушивает новые входящие данные:
go readWriteData(rw)
У этого readWriteData(rw)
есть две задачи:
- читать входящие данные с
rw
- обработать эти данные и отправить сообщение обратной связи также через
rw
Входящие данные, следовательно, сначала анализируются. В зависимости от отправителя и сообщения, ответ записывается в rw. Другие коллеги могут получить его, проанализировать, обработать и ответить снова. Сообщение содержит ключевые слова, которые позволяют иметь логический поток (разновидность сообщения запрос-ответ).
Пока все хорошо. Моя проблема вызвана тем, что эта программа go readWriteData(rw)
содержит также два считывателя, которые считывают ввод с консоли / терминала:
reader := bufio.NewReader(os.Stdin)
Мне нужны эти читатели для второго задания, обработки данных и отправки сообщения обратной связи. Первый reader
используется для начала разговора. В зависимости от того, что является входом от терминала, новое сообщение начинается. Это должно быть всегда открыто для всех узлов.
Второй reader
необходим для предоставления определенного ответа в терминале на данный запрос. В зависимости от ввода с терминала данные обрабатываются по-разному, и различные ответы отправляются через rw
.
Этот тип связи запрос-ответ с использованием двух считывателей в программе не работает должным образом:
Например: Пользователь 1 начинает общение, набирая что-то в терминале и отправляя запрос. Пользователь 1 и 2 получают его немедленно (goroutine). И тут возникает проблема: оба получают данные в goroutine, и первый reader
снова начинает ждать ввода. Но в этом случае мне нужен второй reader
, чтобы ответить на запрос.
Следовательно, существует проблема, заключающаяся в том, что эти два reader
блокируют поток внутри программы go readWriteData(rw)
. Как я могу решить это?