name: workers-multi-lang
description: 使用Rust、Python和WebAssembly进行多语言Workers开发。在构建非JavaScript/TypeScript语言的Workers时,或集成WASM模块用于性能关键代码时使用。
version: 1.0.0
多语言Workers开发
使用Rust、Python或WebAssembly构建Cloudflare Workers,用于性能关键的操作。
语言比较
| 特性 |
JavaScript/TS |
Rust |
Python |
| 启动时间 |
快 |
最快(WASM) |
中等 |
| CPU性能 |
良好 |
优秀 |
良好 |
| 内存使用 |
较高 |
较低 |
较高 |
| 包大小 |
较小 |
中等 |
较大 |
| 类型安全 |
可选(TS) |
严格 |
可选 |
| 最佳用途 |
通用应用 |
CPU密集型 |
数据/机器学习 |
快速决策
需要最大性能? → Rust/WASM
重计算(加密、图像处理)? → Rust/WASM
数据处理、机器学习推理? → Python
通用Web应用? → JavaScript/TypeScript
前10大多语言错误
| 错误 |
语言 |
原因 |
解决方案 |
WebAssembly.instantiate() failed |
Rust |
无效的WASM |
检查wasm-pack构建输出 |
Module parse failed: Unexpected token |
Rust |
ESM/CJS不匹配 |
使用--target bundler |
Cannot find module |
Python |
缺少依赖 |
添加到pyproject.toml |
Out of memory |
所有 |
大型WASM |
启用流式实例化 |
Exceeded CPU time limit |
所有 |
长时间计算 |
分块处理 |
wasm-bindgen version mismatch |
Rust |
依赖冲突 |
在Cargo.toml中对齐版本 |
RuntimeError: unreachable |
Rust |
WASM中panic |
添加适当的错误处理 |
TypeError: not a function |
Rust |
缺少导出 |
添加#[wasm_bindgen]属性 |
Python worker startup timeout |
Python |
启动慢 |
最小化导入 |
SharedArrayBuffer not supported |
所有 |
安全 |
添加COOP/COEP头部 |
Rust快速开始
# 安装工具
cargo install wasm-pack
# 创建项目
cargo new --lib my-worker
cd my-worker
# 添加到Cargo.toml
cat >> Cargo.toml << 'EOF'
[lib]
crate-type = ["cdylib"]
[dependencies]
wasm-bindgen = "0.2"
worker = "0.3"
console_error_panic_hook = "0.1"
[profile.release]
opt-level = "s"
lto = true
EOF
// src/lib.rs
use worker::*;
#[event(fetch)]
async fn fetch(req: Request, env: Env, _ctx: Context) -> Result<Response> {
console_error_panic_hook::set_once();
Router::new()
.get("/", |_, _| Response::ok("Hello from Rust!"))
.get("/compute", |_, _| {
// CPU密集型计算
let result = heavy_computation();
Response::ok(format!("Result: {}", result))
})
.run(req, env)
.await
}
fn heavy_computation() -> u64 {
(1..1_000_000).filter(|n| is_prime(*n)).count() as u64
}
fn is_prime(n: u64) -> bool {
if n < 2 { return false; }
(2..=(n as f64).sqrt() as u64).all(|i| n % i != 0)
}
Python快速开始(Workers for Platforms)
# pyproject.toml
[project]
name = "my-worker"
version = "0.1.0"
requires-python = ">=3.12"
dependencies = []
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
# src/entry.py
from js import Response, Headers
async def on_fetch(request, env):
url = request.url
if "/compute" in url:
result = heavy_computation()
return Response.new(f"Result: {result}")
return Response.new("Hello from Python!")
def heavy_computation():
"""CPU密集型计算"""
return sum(1 for n in range(2, 100000) if is_prime(n))
def is_prime(n):
if n < 2:
return False
return all(n % i != 0 for i in range(2, int(n**0.5) + 1))
WASM模块集成
// 在TypeScript Worker中加载并使用WASM模块
import wasmModule from './pkg/my_lib_bg.wasm';
import { init, process_data } from './pkg/my_lib';
let wasmInstance: WebAssembly.Instance;
export default {
async fetch(request: Request, env: Env): Promise<Response> {
// 一次性初始化WASM
if (!wasmInstance) {
wasmInstance = await WebAssembly.instantiate(wasmModule);
init();
}
// 使用WASM函数
const result = process_data(inputData);
return Response.json({ result });
},
};
何时加载参考
| 参考 |
加载时机 |
references/rust-workers.md |
构建Rust/WASM Workers时 |
references/python-workers.md |
在Workers for Platforms上使用Python时 |
references/wasm-integration.md |
在任何Worker中集成WASM模块时 |
性能提示
- WASM初始化:缓存实例,使用流式处理
- 内存:使用类型化数组进行数据传输
- 包大小:启用LTO,剥离调试信息
- 冷启动:保持WASM模块小巧
- 数据传输:最小化JS/WASM边界跨越
另请参阅
workers-performance - 通用优化技术
workers-testing - 测试多语言Workers
cloudflare-worker-base - 基本Workers设置