Cloudflare 的 Python Workers 转正,绑定调用不用再写 JS 胶水

2026-09-21 CloudflarePythonWorkers无服务器

两年前 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 版本。以前查文档要自己在脑子里翻译一遍,现在不用了。

原文:https://blog.cloudflare.com/python-workers-ga/

原文出处 · 事实以此为准
Cloudflare Blog
阅读原文 ↗