# TSO 分配过程

![center](./student-guide/diagram/04-TSO-Get-Process-01-01.png)
---------------------------------------------------------------
所有 TiDB 与 PD 交互的逻辑都是通过一个 PD Client 的线程模块进行的，这个模块专门负责批量从 PD 获取 TSO，工作流程大致流程如下：

- PD Client 监听一个 channel，如果这个 channel 里有 TSO 请求，那么就会开始向 PD 请求 TSO（如果这个 channel 有多个请求，本次请求会进行 batch），对应图中：1，2。

- 将批量请求而来的 TSO 分配给这些请求。对应图中：3，4，5 和 6。 对于上面的 2 可以展开为下面 3 个阶段：

- PD 将一个 TSO 请求放入这个 channel，异步返回一个 tsFuture 对象标识给 PD Client，这个过程非常快。

- PD Client 将这个 tsFuture 对象标识返回给请求者，当 PD 发送真正 TSO 时，凭 tsFutrue 获取。

- PD 发送真正的 TSO 给 PD Client，请求者就可以通过持有的 tsFuture 对象标识获取这个 TSO。（调用 tsFuture.Wait()）综上所述，整个 TSO 的分配是一个异步的过程。