3

我们有一个完全同步的应用程序,并且将始终如此,因为它基本上是一个命令行解释器,用于向我们的硬件发送低级命令,并且您不能同时将两个命令发送到硬件。对于此配置,我只会有 1 个客户端套接字以同步方式运行,向服务器发送一个命令,它与硬件对话,并将值发送回客户端,但据我所知,目前 async_read 是唯一的方法非阻塞读取。

通过 Beast 获得非阻塞读/写的最佳方法是什么?例如,在 Windows 中的 TCP 和 Serial 中,您可以查看缓冲区以查看数据是否已准备好访问,如果存在,您可以发出读取命令,知道它不会阻塞,因为数据在那里。不确定我是否只是缺少 Beast 中的这个功能,尽管我会说如果可能的话拥有这样的功能会很好。

无论如何,基于此我有一个问题

首先,我可以以 Coroutine 为例,而不是使用 yield,来创建并传递一个 read_handler 函数吗?

我采用了协程示例,并将函数构建到我的类中,并使用了与该线程答案完全相同的 read_handler。 如何将读取处理程序传递给 Beast websocket 的 async_read?

正如他所说,它可以编译,但设置断点永远不会在收到数据时触发。

我真的不需要像异步示例那样的完整异步功能,将其推送到不同的线程中,事实上这让我的生活更加困难,因为应用程序的其余部分不是异步的。而且因为我们允许来自各种来源(键盘/TCP/串行/文件)的输入,我们不能阻止等待数据。

4

2 回答 2

0

通过 Beast 获得非阻塞读/写的最佳方法是什么?

由于 websocket 流的实现方式,不可能支持非阻塞套接字模式。

我可以以协程示例而不是使用 yield 来创建并传递一个 read_handler 函数吗?

如果您想使用完成处理程序,我建议您不要从协程示例开始,而是从异步示例之一开始,因为这些示例已经被编写为使用完成处理程序。

于 2018-04-23T23:55:14.043 回答
0

协程具有阻塞语义,而完成处理程序则没有。如果您尝试使用协程示例并将 yield 表达式替换为完成处理程序,则对启动函数的调用不会像使用协程时那样阻塞。而且你不应该使用 spawn。你说协程的例子要简单得多,可能是因为它类似于同步代码。如果您想要易于编写和理解,那么您必须使用协程。使用完成处理程序的代码将表现出通常与回调相关的“控制反转”。这是它们工作方式所固有的,而不是您可以通过从使用协程的代码开始并更改完成令牌来更改的内容。

于 2018-04-24T23:53:39.630 回答