如何在goroutine中实现多个非阻塞输入阅读器(bufio.NewReader(os.Stdin))?

时间:2019-04-05 14:26:27

标签: go stream goroutine reader

我正在使用golang编码p2p内容。对等方通过缓冲的stream进行通信。使用此流,他们可以通过rw从其中读取和写入数据:

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

rw包含senderID和一条消息(以及一些现在不重要的内容)。

为使系统保持打开状态,我有一个goroutine始终在侦听新的传入数据:

go readWriteData(rw)

readWriteData(rw)有两项任务:

  1. rw读取传入数据
  2. 处理此数据并通过rw
  3. 发送反馈消息

因此,首先解析输入数据。根据发送者和消息,答案会写入rw。其他对等方可以接收,解析,处理它并再次回答。该消息包含关键字,这些关键字使逻辑流程(一种请求-响应通信)成为可能。

到目前为止,一切都很好。我的问题是由于以下事实引起的:此goroutine go readWriteData(rw)还包含两个读取器,这些读取器从控制台/终端读取输入:

reader := bufio.NewReader(os.Stdin)

我需要那些读者来完成第二项任务,以处理数据并发送反馈消息。第一个reader用于开始对话。根据终端输入的内容,开始新的通信。该节点应始终对所有节点打开。 需要第二个reader在终端中为给定的请求提供一定的答案。根据来自终端的输入,对数据进行不同的处理,并通过rw发送不同的答案。

在goroutine中使用两个读取器的这种请求-响应通信无法正常工作:

例如:用户1开始通信,在终端中键入内容并发送请求。用户1和2都立即收到(goroutine)。问题来了:两者都在goroutine中接收数据,并且第一个reader重新开始等待输入。但是在这种情况下,我需要第二个reader来回答请求。

因此,存在一个问题,即这两个reader阻塞了goroutine go readWriteData(rw)中的流程。我该怎么解决?

0 个答案:

没有答案