tokio 是做什么用的? 标准库不是用async吗?
如何让异步多线程并发? 封有没有简单的例子?
// 并发实现原理是不是这样:
写个线程池, 循环读取异步任务队列, 若有异步任务, 派遣线程执行之?;
伪代码
// 异步队列
async fn(){}
let a = fn()
aync_queue.push(a)
// 多线程并发
for{
let futrue = aync_queue.recv()
threadPool.get().run( futrue) // futurn.wait
}
1
共 4 条评论, 1 页
评论区
写评论thanks;
--
👇
Aya0wind: Rust标准库的async/await只是一个协程约定,本身不能干任何事,更没有规定底层实现是单还是多线程,规定这个的是你使用的运行时。而tokio就是这个运行时,其他的运行时还有像async_std等等,你自己也可以实现自己的运行时。然后让用户使用async/await语法基于你的运行时来编写代码。 用tokio作为运行时的话你直接设置一下需要开几个线程就ok了,底层自动就是多线程并发的(一般这个设置都不需要,tokio默认就是多线程的,你只需要不停的spawn新的task即可),你的task运行在哪个线程上是tokio自己调度的,对你是透明的。至于具体实现,和你说的差不太多,tokio确实是线程池里各个线程从全局队列里取task来运行,不过如果有线程提前完成且无新任务,还会尝试从其他负载高的线程拿task过来做,也就是带work stealing的。可以去tokio的官方教程那里学习怎么使用,都学会了之后你也可以尝试实现一个简单的运行时。
Rust标准库的async/await只是一个协程约定,本身不能干任何事,更没有规定底层实现是单还是多线程,规定这个的是你使用的运行时。而tokio就是这个运行时,其他的运行时还有像async_std等等,你自己也可以实现自己的运行时。然后让用户使用async/await语法基于你的运行时来编写代码。 用tokio作为运行时的话你直接设置一下需要开几个线程就ok了,底层自动就是多线程并发的(一般这个设置都不需要,tokio默认就是多线程的,你只需要不停的spawn新的task即可),你的task运行在哪个线程上是tokio自己调度的,对你是透明的。至于具体实现,和你说的差不太多,tokio确实是线程池里各个线程从全局队列里取task来运行,不过如果有线程提前完成且无新任务,还会尝试从其他负载高的线程拿task过来做,也就是带work stealing的。可以去tokio的官方教程那里学习怎么使用,都学会了之后你也可以尝试实现一个简单的运行时。
是不是把异步futrue存放到队列中, 然后自己写个线程池来循环调用?
👇
Mike Tang
async不是单线程,运行他的runtime可以是单线程,也可以是线程池。