如何在C+中实现长时间运行的gRPC异步流数据更新+;服务器 我在C++中创建了一个异步GRPC服务器。其中一种方法是将数据从服务器流到客户端,用于向客户端发送数据更新。数据更新的频率是不可预测的。它们可能几乎连续出现,也可能很少出现,甚至每小时出现一次。gRPC示例中使用的带有“CallData”类和CREATE/PROCESS/FINISH状态的模型似乎不能很好地实现这一点。我看到了一个演示如何创建“轮询”循环的示例,该循环休眠一段时间,然后醒来检查新数据,但这似乎不是很有效

如何在C+中实现长时间运行的gRPC异步流数据更新+;服务器 我在C++中创建了一个异步GRPC服务器。其中一种方法是将数据从服务器流到客户端,用于向客户端发送数据更新。数据更新的频率是不可预测的。它们可能几乎连续出现,也可能很少出现,甚至每小时出现一次。gRPC示例中使用的带有“CallData”类和CREATE/PROCESS/FINISH状态的模型似乎不能很好地实现这一点。我看到了一个演示如何创建“轮询”循环的示例,该循环休眠一段时间,然后醒来检查新数据,但这似乎不是很有效,c++,asynchronous,streaming,grpc,C++,Asynchronous,Streaming,Grpc,还有别的办法吗?如果我使用“CallData”方法,它是否会在“进程”状态下阻塞,直到有数据(这可能不是我的第一选择)?或者更好,我可以构造代码,以便在数据可用时通知gRPC处理程序吗 任何想法或示例都将不胜感激。在服务器端流媒体示例中,您可能需要更多状态,因为您需要跟踪当前是否有正在进行的写入。我将添加两个状态,一个称为WRITE_PENDING,当写入正在进行时使用,另一个称为WRITABLE,当可以立即发送新消息时使用。生成新消息时,如果处于可写状态,则可以立即发送并进入状态WRITE_P

还有别的办法吗?如果我使用“CallData”方法,它是否会在“进程”状态下阻塞,直到有数据(这可能不是我的第一选择)?或者更好,我可以构造代码,以便在数据可用时通知gRPC处理程序吗


任何想法或示例都将不胜感激。

在服务器端流媒体示例中,您可能需要更多状态,因为您需要跟踪当前是否有正在进行的写入。我将添加两个状态,一个称为WRITE_PENDING,当写入正在进行时使用,另一个称为WRITABLE,当可以立即发送新消息时使用。生成新消息时,如果处于可写状态,则可以立即发送并进入状态WRITE_PENDING,但如果处于状态WRITE_PENDING,则新生成的消息需要进入队列,以便在当前写入完成后发送。写入完成后,如果队列非空,则可以从队列中获取下一条消息,并立即开始写入;否则,您可以进入可写状态并等待生成另一条消息

这里应该不需要阻塞,而且您可能无论如何都不想这样做,因为这会占用一个线程,否则该线程将轮询完成队列。如果您的所有线程都以这种方式被阻塞,那么您将对新事件(例如新来电)视而不见

这里的替代方法是使用C++同步API,这更容易使用。在这种情况下,您可以简单地编写直线阻塞代码。但代价是,它在服务器上为每个进行中的调用创建一个线程,因此这可能不可行,具体取决于您处理的通信量


我希望这些信息是有用的

谢谢你的评论。我已经做了一些实验,目前正在使用观察者模式。我的subscribe处理程序对象(从gRPC异步示例中的“CallData”对象派生)注册来自数据生成器线程的通知。当数据可用时,将通知订阅处理程序。在我当前的实现中,在grpc完成队列中设置一个立即过期的报警对象。流写入发生在报警回调期间。这是可行的,尽管这可能不是闹钟的使用方式。我也可以试试你的方法。谢谢。Mark D. Roth有一个C++流异步解决方案的例子,或者C++与线程同步?这个例子不使用线程,但是它基本上和它所用的方式一样:你可以有多个线程来轮询完成队列和执行相应的回调。