如何在 gRPC 异步服务中使用共享完成队列
Posted
技术标签:
【中文标题】如何在 gRPC 异步服务中使用共享完成队列【英文标题】:How to use shared completion queue in gRPC asynchronous service 【发布时间】:2020-08-23 21:43:53 【问题描述】:您好,我正在尝试实现 DBMS 多线程 gRPC 异步服务。现在我坚持使用共享完成队列。我最初保存每个线程启动的 RPC 调用的标签,并根据 cq.Next() 的 rpc 调用返回检查标签,以确保我有正确的线程来检查回复。但是,我从Confusion around CompletionQueue in an async C++ client 发现每个标签只会从 cq 中出来一次。我想知道让多个线程共享同一个 cq 的最佳方法是什么?我希望每个线程能够只处理它启动的 RPC 调用,并且我不希望一个线程等待另一个线程创建的 RPC。这可能吗?怎么做?有没有办法遍历队列,只删除带有匹配标签的 RPC?我没有从之前的 *** 帖子中看到明确的解决方案。
【问题讨论】:
【参考方案1】:我认为completion queue
和thread
可以有两种常用方法
-
多个
completion queue
和多个threads
,每个completion queue
用于一个RPC,一个thread
专注于一个completion queue
一个completion queue
和多个threads
,每个thread
调用completion_queue.Next()
但如果你想让它们混合,这意味着你需要添加另一个middleware
来将事件分配给特定线程。例如,初始化工作时,将tag
记录在一个map
中,调用cq.Next()
时,可以查看map
找到目标thread
。但我找不到这种方式的任何好处。
【讨论】:
以上是关于如何在 gRPC 异步服务中使用共享完成队列的主要内容,如果未能解决你的问题,请参考以下文章