# Pingora 异步运行时与线程模型

URL: https://caijiao.org/pingora/pingora_async_runtime_and_threading_model
Source: docs/pingora/pingora_async_runtime_and_threading_model.md
Description: 学习 Pingora 的异步运行时和线程模型，包括任务调度、异步执行和阻塞操作处理。

Pingora 采用 **异步运行时（Async Runtime）** 和多线程模型，以支持高并发、高性能的请求处理。

## 异步运行时

- 基于 **Tokio** 异步运行时  
- 支持非阻塞 IO 和高效事件循环  
- 异步任务使用 `async/await` 语法编写

### 示例

```rust
#[tokio::main]
async fn main() {
    let server = Server::new(None).unwrap();
    server.bootstrap();

    let app = http_proxy_service(None);
    server.run_forever(app).unwrap();
}
````

## 线程模型

- **工作线程（Worker Threads）**

  - 执行异步任务
  - 默认数量可通过配置调整
- **异步任务调度**

  - 任务在线程池中调度
  - 阻塞操作需特殊处理，否则会影响整个线程池

## 阻塞操作处理

在异步上下文中直接执行阻塞操作会导致性能下降。
Pingora 提供安全方式处理阻塞任务：

```rust
tokio::task::spawn_blocking(|| {
    // 阻塞操作，例如文件 IO 或复杂计算
});
```

- `spawn_blocking` 会将任务调度到专用线程池
- 异步运行时不会被阻塞

## 并发优化

1. **合理设置工作线程数量**
2. **使用连接池复用资源**
3. **避免长时间阻塞异步任务**
4. **充分利用异步过滤器与上下文共享**

## 结合 CTX 与过滤器

异步运行时与上下文（CTX）结合，可以在各阶段安全共享状态：

```rust
async fn my_filter(req: &Request, ctx: &mut Context) -> Result<(), Error> {
    ctx.insert("request_id", req.id());
    Ok(())
}
```

---

通过理解 Pingora 的异步运行时和线程模型，可以更高效地开发高并发代理服务，避免阻塞瓶颈，提升整体性能。
