Cloudflare 的 Python Workers 转正,绑定调用不用再写 JS 胶水
两年前 Cloudflare 把 Pyodide 塞进 Workers 的 Wasm 沙箱,那时候 Python 能跑,但每碰一次平台能力都要写一段 JavaScript。9 月 21 日 GA 之后,这段胶水可以删了。
最实在的变化:绑定不用再转类型
以前往 Queue 里发一条消息得这样写:
from pyodide.ffi import to_js
import js
self.env.QUEUE.send(to_js({"key": "value"}, dict_converter=js.Object.fromEntries))
现在:
self.env.QUEUE.send({"key": "value"})
类型转换被收进了 Workers 运行时和 Python SDK。R2、D1、Workers AI、Durable Objects、Queues、Workflows、Hyperdrive 一视同仁。官方对旧写法的评价是”对人类和 AI agent 都是常见错误来源”——代码里还留着 to_js 的,现在可以整段删掉再跑一遍回归。
Web 框架:asgi / wsgi 两个入口
FastAPI 这类异步应用:
from workers import asgi
Default = asgi.entrypoint(app)
Django 这类同步应用走 workers.wsgi:
from workers import WorkerEntrypoint, wsgi
from your_django_app.wsgi import app
Default = wsgi.entrypoint(app)
它不是在 Worker 里跑一个 uvicorn。Workers 平台本身就是那层 Web 服务器,负责并发连接和扩缩容,workers.asgi / workers.wsgi 只做请求与响应的翻译。所以别去调 worker 数和并发参数,那层不存在。
AI 库能跑了
openai、langchain、mcp 现在可以原生运行。此前它们依赖的 requests / httpx 在 Workers 里因为缺少底层 socket 支持跑不通,Cloudflare 往上游提了改动,让这些 HTTP 客户端在 Wasm 环境里直接走 JavaScript 的 fetch,同时补上了底层 socket 操作。接 Workers AI 的写法:
from langchain_cloudflare import ChatCloudflareWorkersAI
llm = ChatCloudflareWorkersAI(
model_name="@cf/meta/llama-3.3-70b-instruct-fp8-fast",
binding=self.env.AI,
max_tokens=64,
)
限制,写清楚再决定迁不迁
multiprocessing和threading在 Wasm 沙箱里不可用。靠多进程跑批的东西别往这边搬。- 带 C/C++/Rust 原生扩展的包必须交叉编译到 Wasm 才能跑。Cloudflare 推了 PEP 783(PyEmscripten 平台),也把它接进了
cibuildwheel,但生态还在跟进,遇到没有 wasm wheel 的包要先去 Discord 或 GitHub 提。 - 计费方式没变,还是 Workers 本身的请求数与 CPU 时间。GA 不等于免费。
值不值得今天动手
手上有个 FastAPI 小服务跑在 5 美元的 VPS 上、还得自己管 Nginx 和证书的,值得花一个下午试迁——asgi.entrypoint(app) 这一行的迁移成本低到可以忽略,省下来的是长期运维。反过来,重度依赖 pandas / numpy 原生扩展或者多进程并行的,现在迁过来大概率要重写,先等等生态。
顺带一提:Cloudflare 已经把开发者文档里的代码示例补成了三语切换,TypeScript 例子旁边基本都有 Python 版本。以前查文档要自己在脑子里翻译一遍,现在不用了。