如何在 read/write 文件旁边执行异步 read/write Beast websockets?

How to do async read/write Beast websockets alongside read/write of files?

我的 C++ 程序分叉为两个进程,1(原始进程)和 2(分叉进程)。

在派生进程(2)中,它执行了程序A,该程序进行了大量计算。

原始进程 (1) 通过标准输入和重定向到管道的输出与程序 A 通信。

我正在尝试在原始流程 (1) 中向我的代码添加一个 websocket 连接。我希望我的原始进程有效地 select 或 epoll 是否有数据要从管道读取到程序 A 或是否有数据要从 websocket 连接读取。

鉴于野兽 websocket 不是文件描述符,我如何才能实现 select 或 epoll 的效果?

您使用的是哪个版本的 Boost?如果它相对较新,它应该包括对 boost::process::async_pipe which allows you to use I/O Objects besides sockets asynchronously with Asio. Examples are provided in the tutorials for the boost::process library. Since Beast uses the Asio library to perform I/O 的支持,您可以很容易地将两者结合起来。

Given that a beast websocket is not a file descriptor...

Beast WebSocket 不是文件描述符,但它确实使用 TCP 套接字来执行 I/O(参见上面的链接示例),而 Asio 非常擅长使用 select/epoll 和 TCP 套接字.只需确保您照常执行 async_readasync_writeio_service::run 操作即可。

您可以对代码进行少量更改。用两个 Message Queue 替换管道。例如 out_qresponse_q。现在,您的 child 进程 A 将持续读取 out_q 并且每当您的主进程向 out_q 发送消息时,您的主进程将不会等待 child 的任何响应而您的 child 将使用该消息。通过消息队列的通信是异步的。但是如果你仍然需要某种回复,比如来自 child 的任何成功或失败消息,你可以通过 response_q 获得它,它将被你的 parent 进程读取。要了解 child 对最初从 parent 发送的特定消息的响应,您可以使用关联 ID。 (少读有关 correlation id 的内容)。 现在在 parent 进程中实现两个 2 线程,一个将连续读取到 web 调用,另一个将读取到标准输入。还有一种方法(可能是静态的)将连接到 out_q 以删除消息。使用互斥锁,以便只有一个线程可以调用它并将消息发送到 out_q。您的主线程或进程将读取 response_q 。通过这种方式,您可以使一切并行和异步。如果你不想使用线程,你仍然可以选择 fork() 并为此创建两个 child 进程。希望对您有所帮助。