From 39471d7e5e342ab972721a79ff1ec0ba52c8f43a Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Mon, 15 Jul 2019 07:31:48 +0800 Subject: [PATCH] docs(examples): update single_threaded example to async/await --- examples/single_threaded.rs | 55 ++++++++++++++++++++++++++++ examples_disabled/single_threaded.rs | 51 -------------------------- 2 files changed, 55 insertions(+), 51 deletions(-) create mode 100644 examples/single_threaded.rs delete mode 100644 examples_disabled/single_threaded.rs diff --git a/examples/single_threaded.rs b/examples/single_threaded.rs new file mode 100644 index 00000000..1105f060 --- /dev/null +++ b/examples/single_threaded.rs @@ -0,0 +1,55 @@ +#![feature(async_await)] +#![deny(warnings)] + +use std::cell::Cell; +use std::rc::Rc; + +use hyper::{Body, Error, Response, Server}; +use hyper::service::{make_service_fn, service_fn}; +use tokio::runtime::current_thread; + +// Configure a runtime that runs everything on the current thread, +// which means it can spawn !Send futures... +#[hyper::rt::main(single_thread)] +async fn main() { + pretty_env_logger::init(); + + let addr = ([127, 0, 0, 1], 3000).into(); + + // Using a !Send request counter is fine on 1 thread... + let counter = Rc::new(Cell::new(0)); + + let make_service = make_service_fn(move |_| { + // For each connection, clone the counter to use in our service... + let cnt = counter.clone(); + + async move { + Ok::<_, Error>(service_fn(move |_| { + let prev = cnt.get(); + cnt.set(prev + 1); + let value = cnt.get(); + async move { + Ok::<_, Error>(Response::new(Body::from( + format!("Request #{}", value) + ))) + } + })) + } + }); + + // Since the Server needs to spawn some background tasks, we needed + // to configure an Executor that can spawn !Send futures... + let exec = current_thread::TaskExecutor::current(); + + let server = Server::bind(&addr) + .executor(exec) + .serve(make_service); + + println!("Listening on http://{}", addr); + + // The server would block on current thread to await !Send futures. + if let Err(e) = server.await { + eprintln!("server error: {}", e); + } +} + diff --git a/examples_disabled/single_threaded.rs b/examples_disabled/single_threaded.rs deleted file mode 100644 index d39158bc..00000000 --- a/examples_disabled/single_threaded.rs +++ /dev/null @@ -1,51 +0,0 @@ -#![deny(warnings)] -extern crate futures; -extern crate hyper; -extern crate pretty_env_logger; -extern crate tokio; - -use std::cell::Cell; -use std::rc::Rc; - -use hyper::{Body, Response, Server}; -use hyper::service::service_fn_ok; -use hyper::rt::Future; -use tokio::runtime::current_thread; - -fn main() { - pretty_env_logger::init(); - - let addr = ([127, 0, 0, 1], 3000).into(); - - // Using a !Send request counter is fine on 1 thread... - let counter = Rc::new(Cell::new(0)); - - let new_service = move || { - // For each connection, clone the counter to use in our service... - let cnt = counter.clone(); - - service_fn_ok(move |_| { - let prev = cnt.get(); - cnt.set(prev + 1); - Response::new(Body::from(format!("Request count: {}", prev + 1))) - }) - }; - - // Since the Server needs to spawn some background tasks, we needed - // to configure an Executor that can spawn !Send futures... - let exec = current_thread::TaskExecutor::current(); - - let server = Server::bind(&addr) - .executor(exec) - .serve(new_service) - .map_err(|e| eprintln!("server error: {}", e)); - - println!("Listening on http://{}", addr); - - current_thread::Runtime::new() - .expect("rt new") - .spawn(server) - .run() - .expect("rt run"); -} -