tokio之如何观测Rust异步任务的调度

我们知道Rust的异步是以task的调度来构建的。task作为抽象在语言层面的调度单元。

那如果想要观测其的调度执行有没有办法呢?。

有的!异步runtimetokio就有个tokio-console可以实现对异步调度的观测和分析,其对了解调度的机制和性能分析都很有帮助。

Read More

Rust异步编程之Future并发处理

上篇文章我们知道,RustFuture是异步执行,await时是阻塞在当前的异步任务task上,直到完成。

当多个异步任务执行时,如果只能都阻塞一个个执行,那就变成同步串行执行了,当然不是我们通常希望的并发处理方式,今天就来聊聊多个异步任务的一些并发处理方式。

Read More

Rust异步编程之Future初探

RustFuture是用来实现异步编程的。今天我们围绕其了解下Rust的异步编程是如何构建。

Rustasync就能轻松创建开销很小的可异步执行的函数,在await时其才会被调度执行。

其比较轻量级,有别于异步多线程,依托在操作系统线程之上,构建大量并发则需要大量的线程资源,对资源的消耗比较大。

比如下边用async构建异步任务:

1
2
3
4
5
6
7
8
async fn async_fn() {
// handle async logic
}

#[tokio::main]
async fn main() {
async_fn().await
}

Read More

Rust并发控制之Channel

Rust官方sync包中提供了mpsc模式的 (多生产者,单消费者:multi-producer, single-consumer) channel,可以实现基于消息并发控制,而不是依赖控制内存共享(加锁)。这正是go语言作者 R. Pike 所推崇的方式:

Don’t communicate by sharing memory; share memory by communicating. (R. Pike)

今天就聊聊mpsc提供的sync_channelchannel

Read More

Rust并发控制之Semaphore-两线程交替打印

信号量(Semaphore)是一种对资源并发访问控制的方式。

区别于互斥锁(Mutex)是对共享资源的独占访问,Semaphore允许指定多个并发访问共享资源。

就是说Semaphore像一个持有令牌(permit/token)的桶,每一个并发访问需要持有(acquire)一个令牌来访问共享资源,

当没有令牌时,没法访问共享资源,直到有新的令牌加入(add)或者原来发出的令牌放回(release)桶中。

接下来,我们尝试用通过用它来实现两个线程交替打印1和2,来更直观了解如何使用semaphore

Read More