2019-06-30 08:48:53 -07:00
|
|
|
#![cfg(features = "broken")]
|
|
|
|
|
|
2019-02-21 11:56:15 -08:00
|
|
|
extern crate env_logger;
|
2018-02-21 07:42:22 -08:00
|
|
|
extern crate futures;
|
|
|
|
|
extern crate tokio_threadpool;
|
|
|
|
|
|
|
|
|
|
use futures::future::{self, Executor};
|
2019-02-21 11:56:15 -08:00
|
|
|
use tokio_threadpool::*;
|
2018-02-21 07:42:22 -08:00
|
|
|
|
|
|
|
|
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(())
|
2019-02-21 11:56:15 -08:00
|
|
|
}))
|
|
|
|
|
.ok()
|
|
|
|
|
.unwrap();
|
2018-02-21 07:42:22 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
}
|