Below you will find pages that utilize the taxonomy term “Rust”
November 17, 2025
理解 tokio 中的 Task
"\u003ch2 id=\"什么是-task\"\u003e什么是 Task\u003c/h2\u003e\n\u003cp\u003e在 tokio 里, task 是一种轻量级、非阻塞的执行单元,它类似于操作系统线程,但对它的调度不是由操作系统来完成的,而是 tokio runtime 来完成的。这种通用的模式,还有一个名称就是 \u003ca href=\"https://en.wikipedia.org/wiki/Green_threads\"\u003egreen threads\u003c/a\u003e。它很类似于 \u003ca href=\"https://tour.golang.org/concurrency/1\"\u003eGo’s goroutines\u003c/a\u003e, \u003ca href=\"https://kotlinlang.org/docs/reference/coroutines-overview.html\"\u003eKotlin’s coroutines\u003c/a\u003e, or \u003ca href=\"http://erlang.org/doc/getting_started/conc_prog.html#processes\"\u003eErlang’s processes\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e它有三个主要特点,分别是 \u003ccode\u003e轻量级\u003c/code\u003e、\u003ccode\u003e协作式调度\u003c/code\u003e 和 \u003ccode\u003e非阻塞\u003c/code\u003e。\u003c/p\u003e\n\u003ch3 id=\"轻量级\"\u003e轻量级\u003c/h3\u003e\n\u003cp\u003e与Golang里的 goroutine一样,相比操作系统线程而言,它的创建速度非常的快,且很小。对它的调用完成是由用户态代码来完成的。不像操作系统线程那样,每一次调度都需要上下文的切换,因此在用户态切换任务的成本也是极其的低。同样对于它的运行与销毁也是低成本的。\u003c/p\u003e\n\u003ch3 id=\"协作式调度\"\u003e协作式调度\u003c/h3\u003e\n\u003cp\u003e多数操作系统实现的是\u003ccode\u003e抢占式多任务处理\u003c/code\u003e,对于多任务调度一般是由调度器(如操作系统调度器)来负责的,它会根据任务的执行时长,动态的抢占并暂停它,然后执行其它任务,最终实现每个任务都在同步执行的样子。\u003c/p\u003e\n\u003cp\u003e但 tokio 属于 \u003ccode\u003e协作式调度\u003c/code\u003e 机制, …\u003c/p\u003e"
August 14, 2025
Rust 里 thread::park() 与 thread::yield_now() 的区别
"\u003cp\u003e在看 tokio 调度源码时,会有一些操作线程park的函数,而在rust标准库里也同样有类似的方法,那就是 \u003ca href=\"https://doc.rust-lang.org/std/thread/fn.park.html\"\u003ethread::park()\u003c/a\u003e ,同时还有一个咋一看效果类似的函数 \u003ca href=\"https://doc.rust-lang.org/std/thread/fn.yield_now.html\"\u003ethread::yield_new()\u003c/a\u003e, 两个函数都有实现 **\u003ccode\u003e类似\u003c/code\u003e**暂停执行代码的效果,那它们到底又何区别呢?\u003c/p\u003e\n\u003cp\u003e希望通过这篇文章可以让大家搞明白它们两者的区别和使用场景。\u003c/p\u003e\n\u003cp\u003e我们先看一下 \u003ccode\u003ethread::park() \u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"threadpark\"\u003ethread:park()\u003c/h2\u003e\n\u003cp\u003e对于 park 函数的作用主要是实现当前线程的阻塞,并出让CPU,这时OS调度器会将其它线程调度到CPU,继续执行其它任务。但是一旦调用这个函数后,后续线程将一直处于阻塞状态,也就是说此线程将无法获取CPU处理任务,直到调用 unpark() 函数,才恢复正常。\u003c/p\u003e\n\u003cp\u003e从线程状态角度来看,它的转换\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erunning ---\u0026gt; [thread::park()] ---\u0026gt; blocked (等待唤醒)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eblocked ---\u0026gt; [thread::unpark()]---\u0026gt; runnable ---\u0026gt; running (被unpark唤醒后)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e总结\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e …\u003c/li\u003e\u003c/ul\u003e"
July 10, 2025
从Vec的 swap_remove 方法中学到的性能优化
"\u003cp\u003e今天在看 tokio 源码时,发现一个 \u003ca href=\"https://github.com/tokio-rs/tokio/blob/master/tokio/src/runtime/scheduler/multi_thread/idle.rs#L129-L145\"\u003eunpark_worker_by_id\u003c/a\u003e 函数里调用了标准库Vec 的 \u003ca href=\"https://github.com/rust-lang/rust/blob/master/library/alloc/src/vec/mod.rs#L2014-L2036\"\u003eswap_remove\u003c/a\u003e方法,\u003ccode\u003eswap_remove\u003c/code\u003e 实现如下\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003epub\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003efn\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eswap_remove\u003c/span\u003e(\u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003emut\u003c/span\u003e self, index: \u003cspan style=\"color:#66d9ef\"\u003eusize\u003c/span\u003e) -\u0026gt; \u003cspan style=\"color:#a6e22e\"\u003eT\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e#[cold]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e#[cfg_attr(not(panic = \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;immediate-abort\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#75715e\"\u003e), inline(never))]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#75715e\"\u003e#[optimize(size)]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003efn\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eassert_failed\u003c/span\u003e(index: \u003cspan style=\"color:#66d9ef\"\u003eusize\u003c/span\u003e, len: \u003cspan style=\"color:#66d9ef\"\u003eusize\u003c/span\u003e) -\u0026gt; \u003cspan style=\"color:#f92672\"\u003e!\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#a6e22e\"\u003epanic!\u003c/span\u003e(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;swap_remove index (is \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{index}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e) should be \u0026lt; len (is \u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e{len}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e)\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003elet\u003c/span\u003e len \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e self.len();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e index \u003cspan style=\"color:#f92672\"\u003e\u0026gt;=\u003c/span\u003e len { …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"