这篇文章我们会介绍 gRPC 的异步编程,如果读者没有使用过 gRPC 的经验,可以先阅读我之前写过的 gRPC 编程指南。
异步 Client
gRPC 支持同步和异步两种编程方式。同步编程理解起来比较容易,譬如说,当一个同步的 client 调用 server 的某个方法时,它会一直处于阻塞状态,等待 server 发送回响应。
同步的代码编写起来也很简单,和一般的函数调用差不多:
然而对于同步的 client 来说,由于调用远程方法时会阻塞当前线程,所以它无法同时发送多个请求。如果需要同时发送多个请求,那么只能每次发送请求时都在新的线程中发送,而频繁地创建线程会带来不小的开销。
异步 client 成功地解决了这两个问题:它允许同时发送多个请求,并且每次发送请求时都不需要另外创建线程。异步 client 的解决思路很简单:
- gRPC 本身提供了异步 API,譬如说我们想调用 server 的
SayHello()
方法,我们可以调用它的异步版本AsyncSayHello()
,调用之后会立即返回,不会阻塞。 - 当方法调用成功时,我们可以让 gRPC 自动将返回结果放到一个
CompletionQueue
的队列中(CompletionQueue
是一个阻塞队列,并且是线程安全的)。 - 程序可以启动一个线程,这个线程要做的事,就是不断地从队列中取出结果并处理。
相比于同步的 client 来说,异步的 client 会稍显复杂。完整的代码可以看这里: