如何在读写文件的同时进行异步读写 Beast websockets?

3
我有一个C++程序,可以分叉成两个进程,1号(原始进程)和2号(派生进程)。
在派生进程2中,它执行了一个做很多计算的程序A。
原始进程1通过重定向到管道的标准输入输出与程序A进行通信。
我试图在原始进程1的代码中添加websocket连接。我希望我的原始进程能够有效地选择或轮询,是否存在从连接到程序A的管道中读取数据,或者存在从websocket连接中读取数据的情况。
鉴于beast websocket不是文件描述符,如何模拟select或epoll的效果呢?
2个回答

3
您使用的是哪个版本的 Boost?如果它是相对较新的版本,那么它应该包含对boost::process::async_pipe的支持,该支持允许您与 Asio 一起异步使用除套接字以外的 I/O 对象。示例可以在 boost::process library 的教程中找到。由于 Beast 在底层使用 Asio 库执行 I/O,因此您可以轻松地将两者结合起来。
考虑到 Beast WebSocket 不是文件描述符……
Beast WebSocket 不是文件描述符,但它确实使用 TCP 套接字执行 I/O(请参见上面链接的示例),而且 Asio 很擅长使用 select/epoll 进行 TCP 套接字控制。只需确保像往常一样进行async_readasync_writeio_service::run操作即可。

{btsdaf} - user782220

1

你可以对代码进行小的更改。用两个Message Queue代替管道。例如,out_qresponse_q。现在你的子进程A将不断地读取out_q,当你的主进程向out_q中放置消息时,你的主进程将不会等待来自子进程的任何响应,而是由子进程消耗该消息。通过消息队列进行通信是异步的。但如果你仍然需要类似于来自子进程的成功或失败消息的回复,你可以通过response_q获取它,这将被父进程读取。要知道从父进程最初发送的特定消息的子进程响应,可以使用关联ID(correlation id)。(简单了解一下关联ID)。现在,在父进程中实现两个线程,一个将不断地读取Web调用,另一个将读取标准输入。还有一个方法(可能是静态的),它将连接到out_q以放置消息。使用互斥锁确保只有一个线程可以调用它并将消息放置到out_q中。你的主线程或进程将读取response_q。通过这种方式,你可以使一切并行和异步。如果你不想使用线程,你仍然有选项可以使用fork()并为其创建两个子进程。希望这能帮助到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接