我tokio_core::net::TcpListener
创建了一个,然后调用该incoming
方法以获取传入连接流。然后我使用该for_each
流上的方法将其变成未来并在事件循环上运行未来。一旦我这样做了,以后有什么办法可以解除与端口的绑定?
如果没有,Tokio 中是否还有其他 API 可用于创建可关闭的 TCP 服务器?
我tokio_core::net::TcpListener
创建了一个,然后调用该incoming
方法以获取传入连接流。然后我使用该for_each
流上的方法将其变成未来并在事件循环上运行未来。一旦我这样做了,以后有什么办法可以解除与端口的绑定?
如果没有,Tokio 中是否还有其他 API 可用于创建可关闭的 TCP 服务器?
简而言之,您需要删除TcpListener
/Future
返回的for_each
.
你可以:
Future
为包含应用程序其余状态的某些结构编写实现。然后Future::poll
,您的结构的实现poll
包含所有Future
状态,Async::Ready
如果您想提前退出,则返回。如果包含Future
的 s 被包装oneshot::spawn
在它们自己的任务中运行,它可能会提高性能。
您的结构将包含一个Option<SpawnHandle<(), ...>>
. 如果您想停止收听,只需将其设置为None
.
incoming
通过检查一些“全局”( )标志来过滤流Arc<AtomicBool>
是否继续使用Stream::take_while
for_each
是否继续侦听并返回错误(停止for_each
循环)后两种方法仅在看到/处理传入连接后停止,因此它们仅在繁忙的环境中工作。
这是我最近发现的另一种选择。
您基本上需要删除TcpListener
/for_each
未来才能停止收听。由于它永远不会自行完成,只需将它与您控制的另一个未来(例如 a oneshot::Receiver<()>
)结合使用select()
. 如果侦听器完成(从不)或 oneshot 收到一个值(您可以通过向另一端发送某些内容来触发),则返回的未来将完成。
对于需要关闭多个事物的更复杂的程序,还有一个带有一个和多个s的watch
通道。Sender
Receiver<()>
还有一些建议可以让期货箱本身更容易做到这一点。