Как заставить задачу `async_std` запускаться на одном потоке в ржавчине? - PullRequest
0 голосов
/ 01 мая 2020

Я новичок в ржавчине и пробую асин c впервые в ржавчине. Здесь, в примере, я запускаю интенсивный процессоре рекурсивных рядов Фибоначчи с использованием async-std, и независимо от того, выполняю ли я одну задачу или две, она занимает примерно одно и то же время (~ 7 сек).

Это похоже, что задачи выполняются в нескольких потоках во время выполнения asyn c.

Есть ли способ заставить задачи asyn c выполняться в одном потоке?

use std::time;
use async_std::task;

fn main() {

    let start = time::Instant::now();

    let s1 = task::spawn(fib_async(46));
    let s2 = task::spawn(fib_async(46));

    task::block_on(s1);
    task::block_on(s2);
    let elap = time::Instant::now().duration_since(start);

    println!("time took for tasks to finish: {} seconds", elap.as_secs());

}


async fn fib_async(n: i32) -> i32 {
    fib(n)
}

fn fib(n: i32) -> i32 {
    if n == 0 || n == 1 {
        1
    } else {
        fib(n-1) + fib(n-2)
    }
}


1 Ответ

0 голосов
/ 01 мая 2020

Согласно документам async_std::task вы не можете.

Этот модуль похож на std :: thread, за исключением того, что вместо потоков используются асинхронные задачи.

Таким образом, он предназначен для создания нового потока, как вы начинаете новый поток с std::thread::spawn.

Если вы хотите обрабатывать данные последовательно, вы можете реализовать рабочий шаблон производителя:

use async_std::task;
use std::time;

#[async_std::main]
async fn main() {
    let (tx, rx) = flume::unbounded();

    let s = task::spawn(async move {
        for n in rx.into_iter() {
            println!("Calc fib of {}", n);
            let fib = fib_async(n).await;
            println!("{}", fib);
        }
    });

    let start = time::Instant::now();


    tx.send(40).unwrap();
    tx.send(40).unwrap();

    drop(tx);
    s.await;

    let elap = time::Instant::now().duration_since(start);
    println!("time took for tasks to finish: {} seconds", elap.as_secs());
}

async fn fib_async(n: i32) -> i32 {
    fib(n)
}

fn fib(n: i32) -> i32 {
    if n == 0 || n == 1 {
        1
    } else {
        fib(n - 1) + fib(n - 2)
    }
}

С зависимостями Car go:

[dependencies]
async-std = { version = "1.5", features = ["attributes"] }
flume = "0.7"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...