stream-cancel
This crate provides a mechanism for interrupting a Stream
.
Any stream can be wrapped in a [Valved
], which enables it to be remotely terminated through
an associated [ValveHandle
]. This can be useful to implement graceful shutdown on "infinite"
streams like a TcpListener
. Once [ValveHandle::close
] is called on the handle for a given
stream's [Valved
], the stream will yield None
to indicate that it has terminated.
extern crate tokio;
use Valved;
use *;
use thread;
let listener = bind.unwrap;
let = new;
let server = spawn;
// the server thread will normally never exit, since more connections
// can always arrive. however, with a Valved, we can turn off the
// stream of incoming connections to initiate a graceful shutdown
exit.close;
server.join.unwrap;
You can share the same [ValveHandle
] between multiple streams by first creating a [Valve
],
and then wrapping multiple streams using [Valve::Wrap
]:
extern crate tokio;
use Valve;
use *;
let = new;
let listener1 = bind.unwrap;
let listener2 = bind.unwrap;
let incoming1 = valve.wrap;
let incoming2 = valve.wrap;
let mut rt = new.unwrap;
rt.spawn;
// the runtime will not become idle until both incoming1 and incoming2 have stopped (due to
// the select). this checks that they are indeed both interrupted when the valve is closed.
exit.close;
rt.shutdown_on_idle.wait.unwrap;