< 返回版块

sstudioer 发表于 2021-03-03 22:53

tokio 是做什么用的? 标准库不是用async吗?

如何让异步多线程并发? 封有没有简单的例子?

// 并发实现原理是不是这样:

写个线程池, 循环读取异步任务队列, 若有异步任务, 派遣线程执行之?;

伪代码
// 异步队列
async fn(){}
let a = fn()
aync_queue.push(a)

// 多线程并发
for{
   let futrue =  aync_queue.recv()

   threadPool.get().run( futrue) // futurn.wait
}

评论区

写评论
作者 sstudioer 2021-03-04 12:54

thanks;

--
👇
Aya0wind: Rust标准库的async/await只是一个协程约定,本身不能干任何事,更没有规定底层实现是单还是多线程,规定这个的是你使用的运行时。而tokio就是这个运行时,其他的运行时还有像async_std等等,你自己也可以实现自己的运行时。然后让用户使用async/await语法基于你的运行时来编写代码。 用tokio作为运行时的话你直接设置一下需要开几个线程就ok了,底层自动就是多线程并发的(一般这个设置都不需要,tokio默认就是多线程的,你只需要不停的spawn新的task即可),你的task运行在哪个线程上是tokio自己调度的,对你是透明的。至于具体实现,和你说的差不太多,tokio确实是线程池里各个线程从全局队列里取task来运行,不过如果有线程提前完成且无新任务,还会尝试从其他负载高的线程拿task过来做,也就是带work stealing的。可以去tokio的官方教程那里学习怎么使用,都学会了之后你也可以尝试实现一个简单的运行时。

Aya0wind 2021-03-04 01:16

Rust标准库的async/await只是一个协程约定,本身不能干任何事,更没有规定底层实现是单还是多线程,规定这个的是你使用的运行时。而tokio就是这个运行时,其他的运行时还有像async_std等等,你自己也可以实现自己的运行时。然后让用户使用async/await语法基于你的运行时来编写代码。 用tokio作为运行时的话你直接设置一下需要开几个线程就ok了,底层自动就是多线程并发的(一般这个设置都不需要,tokio默认就是多线程的,你只需要不停的spawn新的task即可),你的task运行在哪个线程上是tokio自己调度的,对你是透明的。至于具体实现,和你说的差不太多,tokio确实是线程池里各个线程从全局队列里取task来运行,不过如果有线程提前完成且无新任务,还会尝试从其他负载高的线程拿task过来做,也就是带work stealing的。可以去tokio的官方教程那里学习怎么使用,都学会了之后你也可以尝试实现一个简单的运行时。

作者 sstudioer 2021-03-04 00:18

是不是把异步futrue存放到队列中, 然后自己写个线程池来循环调用?

👇
Mike Tang

Mike Tang 2021-03-03 22:54

async不是单线程,运行他的runtime可以是单线程,也可以是线程池。

1 共 4 条评论, 1 页