extern crate env_logger; extern crate futures; extern crate tokio_threadpool; use futures::future::{self, Executor}; use tokio_threadpool::*; use std::sync::mpsc; const ITER: usize = 2_000_000; // const ITER: usize = 30; fn chained_spawn() { let pool = ThreadPool::new(); let tx = pool.sender().clone(); fn spawn(tx: Sender, res_tx: mpsc::Sender<()>, n: usize) { if n == 0 { res_tx.send(()).unwrap(); } else { let tx2 = tx.clone(); tx.execute(future::lazy(move || { spawn(tx2, res_tx, n - 1); Ok(()) })) .ok() .unwrap(); } } loop { println!("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); let (res_tx, res_rx) = mpsc::channel(); for _ in 0..10 { spawn(tx.clone(), res_tx.clone(), ITER); } for _ in 0..10 { res_rx.recv().unwrap(); } } } pub fn main() { let _ = ::env_logger::init(); chained_spawn(); }