使用 tokio rust 共享线程之间的 TCP 连接(多路复用器)

Share TCP Connection between threads with tokio rust (Multiplexor)

提问人:Tutu ツ 提问时间:11/14/2023 更新时间:11/14/2023 访问量:40

问:

我想知道是否有办法在不同线程之间共享相同的 tcp 连接而无需阻止它。

出现的问题是,如果在其中一个线程被阻止写入或读取时,不同的线程与 共享相同的连接,则另一个线程将无法与此 TCP 连接交互,因为它被阻止。有没有办法避免这种情况,而不需要为每个线程创建连接?在线程很少的服务器中,它可以工作,但是当我们尝试扩展时,我们不希望连接数与线程数一样多。clone()

例如,在 rabbitMQ 中,您可以通过不同的通道共享相同的 tcp 连接,因此不同的线程可以与该 tcp 连接与服务器通信,因为它们在该 tcp 连接上具有独立的通道。

Tokio 是否有任何功能或属性允许这样做?是否有任何其他库能够共享来自此独立通道的 TCP 连接以避免阻塞?

TCP Rust-tokio

评论

0赞 Aleksander Krauze 11/15/2023
你想共享一个 TcpListenerTcpStream
0赞 cdhowie 11/15/2023
在没有某种同步的情况下进行共享是无意中交错写入的秘诀。
2赞 user2407038 11/15/2023
TCP 连接最终是串行的 - 写入的数据是按写入顺序传递的 - 这基本上是 TCP 的基本保证之一,因此没有办法逃避它。允许您“共享”TCP 连接的协议在 TCP 之上执行自己的多路复用。...
2赞 user2407038 11/15/2023
...执行此操作的一种简单方法是让一个线程从多生产者队列中读取数据,并将该数据写入 TCP 连接。这很简单,但是对于如何在接收端重建不同的并行“消息”没有明显的选择,只有知道你发送的数据的特征(你没有描述),你才能想出一个方案来做到这一点。例如,一种这样的方案是标记每条消息的每个部分,然后将消息放在接收端从 Tag 到 Message 的映射中。

答: 暂无答案