在Tokio中是否可能关闭TcpListener?

10
我有一个 `tokio_core::net::TcpListener` 对象,我创建了它并调用了 `incoming` 方法去获取一个传入连接的流。然后,我使用该流上的 `for_each` 方法将其转换为一个 future,并在事件循环中运行该 future。一旦我这样做了,是否有任何方法可以稍后取消对该端口的绑定?
如果没有,则是否有其他 Tokio API 可以用于创建可关闭的 TCP 服务器?
2个回答

6
简而言之,您需要放弃TcpListener / for_each返回的Future
您可以:
  • 为包含应用程序其余状态的某些结构编写Future实现。然后,您的结构的Future :: poll实现会poll所有包含的Future状态,并在要提前退出时返回Async :: Ready。如果将包含的Future包装在oneshot :: spawn中以在它们自己的任务中运行,则可能有助于性能。
  • 通过检查一些“全局”(Arc<AtomicBool>)标志来过滤incoming流,以确定是否继续使用Stream :: take_while监听
  • for_each处理程序结束时检查是否继续侦听,否则返回错误(停止for_each循环)
后两种方法只有在繁忙的环境中看到/处理传入连接后才会停止。

1
如果您已将TcpListener / for_each返回的Future传递给core.run(future),那么如何放弃它们呢? :-/ - Nawaz

5
我最近发现了另一个选择。您只需要放弃TcpListener/for_each future来停止监听,因为它本身永远不会完成,所以使用select()将其与您控制的另一个future(例如oneshot::Receiver<()>)组合即可。如果侦听器完成(永远不会),或者单向接收器接收到值(您可以通过将某些内容发送到另一端来触发),则返回的future将完成。
对于需要关闭多个组件的更复杂程序,还有一个带有一个Sender和多个Receiver<()>watch channel
也有建议在futures crate中使此过程更简单

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接