Hai năm trước một khách hàng nhờ mình đặt một API gợi ý nhẹ lên Cloudflare Workers. Mình từ chối, lý do là Python. Team data science của họ giữ code serving model bằng Python, team platform của mình sống trong hệ sinh thái Workers, và nối hai bên nghĩa là hoặc viết lại logic inference bằng JavaScript, hoặc dựng hẳn một tầng compute riêng chỉ để host một process Python. Cuối cùng chọn tầng compute riêng. Nó chạy được, nhưng thêm một hop, thêm một pipeline deploy, thêm một hóa đơn.
Ngày 21/9, Cloudflare đưa Python Workers lên GA, và chi tiết thực sự quan trọng không phải “Python giờ chạy được trên Workers” — mà là nó chạy với TCP socket thật. Những lần thử Python-trên-edge trước đây (kể cả bản beta cũ của chính Cloudflare) chỉ là sandbox gọi REST: gọi HTTP API thì được, nói chuyện với database thật thì vô dụng. Bản này thêm socket support thật, nghĩa là aiomysql và asyncpg chạy được. Đó là khoảng cách giữa một bản demo và một thứ bạn dám đưa vào production.
Họ làm thế nào
Python Workers chạy trên Pyodide — Python compile sang WebAssembly. Phần kỹ thuật thú vị nằm ở chỗ họ làm networking thật hoạt động bên trong một sandbox WASM vốn không có socket syscall gốc. Cloudflare chặn các lời gọi ở tầng socket của Python và dịch chúng sang API connect() của nền tảng Workers — API vốn đã xử lý TCP thô cho các runtime khác. Vậy nên asyncpg nghĩ nó đang mở một socket bình thường; bên dưới, lời gọi đó bị định tuyến lại qua tầng kết nối của Workers tới một instance Postgres thật.
Bên cạnh đó, họ tung ra module cầu nối workers.asgi và workers.wsgi, nên app FastAPI, Django, Flask deploy gần như không cần sửa. Và — đây là phần đáng chú ý nếu bạn làm gì đó liên quan AI — requests và httpx được định tuyến ngầm qua fetch() của Workers, nghĩa là các package xây trên hai thư viện đó chạy được ngay. SDK Python của openai. langchain, cộng thêm một package tích hợp chính chủ mới langchain-cloudflare. Package mcp. Tất cả chạy như edge function, không phải một lớp proxy đứng trước một “server thật” ở đâu đó.
Cloudflare cũng đưa PEP 783 được chấp nhận upstream — một platform tag mới PyEmscripten cho việc đóng gói Python. Đó là tín hiệu lặng lẽ hơn nhưng bền hơn so với chính thông báo GA: chạy Python compile sang WASM trong một sandbox serverless giờ là thứ mà hệ sinh thái packaging Python chính thức công nhận là một nền tảng đích, không còn là hack riêng của Cloudflare.
Nó thực sự mang lại gì
# wrangler.toml
name = "edge-agent-endpoint"
main = "src/entry.py"
compatibility_flags = ["python_workers"]
compatibility_date = "2026-09-21"
# src/entry.py
from fastapi import FastAPI
from openai import AsyncOpenAI
import asyncpg
app = FastAPI()
client = AsyncOpenAI() # key được tiêm qua Workers secret binding
@app.post("/classify")
async def classify(payload: dict):
conn = await asyncpg.connect(dsn="postgresql://...")
history = await conn.fetch(
"select label from classifications where user_id = $1 limit 5", payload["user_id"]
)
response = await client.chat.completions.create(
model="gpt-6-luna",
messages=[{"role": "user", "content": payload["text"]}],
)
await conn.close()
return {"label": response.choices[0].message.content}
Đó là một endpoint thật — đọc DB, gọi LLM, trả lời dựa trên dữ liệu DB — chạy ở bất kỳ edge node nào của Cloudflare gần request nhất, không cần dựng tầng compute riêng. Với một endpoint classification hoặc routing nhẹ đứng trước một hệ thống lớn hơn, đây là thứ thực sự hữu ích: bạn có phân phối toàn cầu và mô hình giá của Workers cho một việc mà trước đây cần Lambda hoặc container riêng.
Chỗ mình vẫn nói không
Mình sẽ không đặt bất cứ thứ gì nặng CPU ở đây. Pyodide là WASM, và Python chạy trên WASM vẫn chậm hơn đáng kể so với CPython cho bất cứ thứ gì tính toán số. Không ai chạy inference model thật bên trong chính Worker cả, và Cloudflare cũng không claim điều đó. Pattern đúng là Worker ở edge làm tầng orchestration mỏng, stateless, gọi ra ngoài tới nơi làm inference thật (Workers AI, Bedrock, chỗ nào cũng được) — không phải chỗ để chạy forward pass của riêng bạn.
Mình cũng muốn thấy cái này chạy production ổn định một quý trước khi tin tưởng giao cho thứ gì nhạy cảm về độ trễ và có state. Socket support bên trong sandbox WASM còn quá mới — GA mới bốn ngày — nên mình đoán sẽ có edge case ở connection pooling và timeout mà chưa ai gặp phải. Khoảng cách từ demo đến production cho “socket thật trong sandbox kiểu browser-engine” thường rộng hơn những gì bài blog thông báo gợi ý.
Nhưng khách hàng mình từ chối hai năm trước? Dự án đó đúng cái khuôn mà tính năng này giờ vừa khít: một tầng classification mỏng, một lookup Postgres nhỏ, một lời gọi LLM, deploy toàn cầu mà không phải sở hữu tầng compute thứ hai. Nếu họ hỏi lại hôm nay, câu trả lời đổi thành “được, nhưng thử pilot ở endpoint ít rủi ro trước đã.”