简介

spawn_blocking专用于执行阻塞的函数,比如需要执行一个非常复杂的计算,极其耗CPU。
spawn就是用于执行异步函数

特点

两者分别使用不同的事件队列

  • max_blocking_threads()
  • worker_threads()

分别设置spawn_blocking和spawn调度用的工作线程数

例子

use async_std::prelude::FutureExt;
use tokio::{runtime, task};
use tokio::io::AsyncReadExt;
use tokio::time::{Duration, sleep};

async fn Fun() {
    println!("async fun");
    loop {}
}

async fn Fun2() {
    println!("async fun2");
    loop {}
}

fn Func1() {
    println!("block fun1");
    loop {}
}

fn Func2() {
    println!("block fun2");
    loop {}
}

#[tokio::main]
async fn main() {
    let rt = runtime::Builder::new_multi_thread().enable_all().max_blocking_threads(1).worker_threads(1).build().unwrap();
    println!("start");
    rt.spawn_blocking(Func1);
    rt.spawn_blocking(Func2);
    rt.spawn(Fun());
    rt.spawn(Fun2());
    println!("finish");
    loop {}
}

Func2和Fun2不会被执行,因为两个队列分别被各自的Func1和Fun阻塞住了。把两个1都改为2就行了。