2026-09-21 · 原文发布日
Cloudflare Python Workers正式可用
Cloudflare边缘Workers平台结束两年预览期,Python成为正式支持的语言:代码经Pyodide编译成WebAssembly跑在V8运行时里,配套pywrangler工具可完整模拟本地运行环境。注意WebAssembly环境下多进程和多线程不可用。对想在边缘节点跑Python脚本、接AI API的开发者是个新选项。
原文要点
Cloudflare的Python Workers结束两年预览期转为正式可用,官方称Python成为平台一等支持语言。实现方式是用Pyodide把Python编译成WebAssembly,跑在基于V8的workerd运行时里,因此multiprocessing和threading均不可用。本地开发工具pywrangler在PyPI上的包名是workers-py,它通过一个约123MB的workerd二进制(位于node_modules/@cloudflare/workerd-darwin-arm64/bin/workerd)在本地完整模拟线上栈。发布署名为Gyeongjae Choi、Dominik Picheta、Hood Chatham,其中两人是Pyodide核心维护者。
这次做成什么
在Cloudflare边缘部署一个接收JSON数组、返回统计结果的Python Worker,全程用pywrangler在本地先模拟跑通再上线,借此确认WebAssembly环境的行为边界。
准备什么
- 一个Cloudflare账号并开通Workers
- 本地Python 3环境,可用pip安装workers-py
- 网络可访问PyPI与Cloudflare仪表盘的命令行
具体怎么做
安装工具并建项目
执行pip install workers-py安装pywrangler;新建目录后用pywrangler init初始化Python Worker项目(具体子命令与参数以官方文档为准核对)。注意首次本地运行会拉取约123MB的workerd二进制到node_modules/@cloudflare/workerd-*/bin/下。
编写入口代码
编辑src/entry.py,使用workers包提供的WorkerEntrypoint与Response写一个fetch处理类:解析请求体JSON中的numbers数组,计算计数、总和、平均值并以JSON返回;不要用threading或multiprocessing。
本地模拟运行
在项目目录运行pywrangler dev启动本地模拟,它会在本机用Pyodide+WebAssembly+V8的workerd跑代码;用curl向本地端口POST测试数据,确认返回JSON结构正确。
部署并验证
执行pywrangler deploy发布到Cloudflare,记下分配的workers.dev地址,再用同样的curl请求打线上地址,对比本地与线上输出一致。
可直接复制的材料
入口代码entry.py
本站独立编写的示例代码;workers包的导入方式与Response API以Cloudflare官方Python Workers文档为准核对后再用
from workers import WorkerEntrypoint, Response
import json
class Default(WorkerEntrypoint):
async def fetch(self, request):
if request.method != "POST":
return Response.json({"error": "only POST supported"}, status=405)
try:
body = await request.json()
except Exception:
return Response.json({"error": "invalid JSON body"}, status=400)
numbers = body.get("numbers")
if not isinstance(numbers, list) or not numbers:
return Response.json({"error": "numbers must be a non-empty list"}, status=400)
total = sum(numbers)
result = {
"count": len(numbers),
"sum": total,
"avg": round(total / len(numbers), 4),
"max": max(numbers),
"min": min(numbers)
}
return Response("application/json").json(result) if False else Response(json.dumps(result), headers={"Content-Type": "application/json"})请求测试命令
本站示例命令;部署后把地址替换为pywrangler输出的实际workers.dev地址
curl -X POST https://你的worker名.你的子域.workers.dev -H "Content-Type: application/json" -d "{\"numbers\": [12.5, 7, 30, 4.5, 16]}"输入与输出示例
本站虚构演示,按示例代码手工推算,非实际调用线上结果
输入
POST请求体 {"numbers": [12.5, 7, 30, 4.5, 16]},共5个虚构数值对应输出
{"count": 5, "sum": 70.0, "avg": 14.0, "max": 30, "min": 4.5}做完检查这些
- pywrangler dev本地启动后curl能拿到与预期一致的JSON统计结果
- 部署到workers.dev后同一请求返回字段与本地完全一致
- 代码中不出现import threading或multiprocessing也能正常运行
- 首次本地运行时node_modules下出现workerd平台二进制文件
容易卡住的地方
- WebAssembly虚拟机内multiprocessing和threading不可用,依赖它们的库会直接失败
- 第三方包受Pyodide支持范围限制,含原生扩展的包未必能装
- PyPI上工具包名是workers-py而不是pywrangler,装错名字会找不到命令
- workerd二进制约123MB,CI或磁盘紧张的环境要预留空间
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Cloudflare Python Workers are now generally available
- 原作者
- Simon Willison
- 原始发布日期
- 2026-09-21
- 来源
- https://simonwillison.net/2026/Sep/21/cloudflare-python-worker/