所以代码里如果不可避免的有(少量的)阻塞调用, 就要为 runtime 启动更多的 worker 线程, 保证存在没被阻塞的 worker 来执行待调度的 task, 以避免整个tokio runtime...-1 本地的 lifo_slot.
• Future f2 在 runtime-1 执行后返回 Pending, 被放入共享队列 run_queue.
• Future f3 在 runtime-1 中执行..., 它将一个任务 f4 交给其他的 runtime 去完成(例如为了隔离网络IO和本地磁盘IO), 使用 block_on(f4)[4] 的方式, 等待执行结果返回.
• f4 中也需要锁 m, 等待....这时, f2 在共享队列 run_queue 中, 可以被执行, 但是 f1 在 worker-1 本地的 lifo_slot 里, 只能由 worker-1 调度, 但 worker-1 当前阻塞在...于是等待关系形成了一个环: f4 → m(f1) → f3 → f4, hang死任务达成.