Cloudflare Blog
90

Sản phẩm

Cloudflare chính thức hỗ trợ Python cho Workers

(giờ Việt Nam)

Tóm tắt AI

Cloudflare Workers hiện đã hỗ trợ chạy trực tiếp các framework Python và thư viện AI mà không cần mã JavaScript trung gian, giúp tích hợp mượt mà với hệ sinh thái D1, R2 và Workers AI.

Bản dịch AI

Python Workers are now generally available

Chúng tôi đã giới thiệu Python Workers cách đây hai năm, cung cấp một phương thức để chạy các ứng dụng Python trong môi trường runtime của Cloudflare Workers. Mục tiêu của chúng tôi là giúp việc viết Workers bằng Python trở nên đơn giản như với TypeScript, đồng thời đảm bảo hệ sinh thái các gói và framework Python có thể "hoạt động ngay lập tức".

Hôm nay, Python Workers đã chính thức được phát hành rộng rãi (GA).

GA nghĩa là gì? Điều đó có nghĩa là Python hiện đã trở thành một ngôn ngữ hạng nhất, được hỗ trợ đầy đủ trên Cloudflare Developer Platform. Bạn có thể mang mã nguồn, thư viện và các thiết kế mẫu Python quen thuộc của mình để kết nối liền mạch với Workers AI, R2, D1, Hyperdrive, Durable Objects, Queues, Workflows và toàn bộ nền tảng Cloudflare. Bạn cũng có thể chạy các framework Python phổ biến như FastAPI, Django và Flask bên trong Python Workers. Thậm chí, bạn còn có thể tạo một Python Worker bên trong một Worker khác bằng cách sử dụng Dynamic Workers.

Hành trình đằng sau Python Workers

Việc đưa Python vào Cloudflare Workers là một lựa chọn tự nhiên. Vì Workers đã hỗ trợ WebAssembly từ năm 2018, đây là môi trường hoàn hảo để chúng tôi chạy trình thông dịch Python đã biên dịch sang Wasm. Bằng cách sử dụng Pyodide, chúng tôi đã có thể nhanh chóng hỗ trợ nhiều loại ứng dụng Python trong Cloudflare Workers.

Mục tiêu của chúng tôi là tạo ra nền tảng đầu tiên cho các ứng dụng Python có khả năng mở rộng vô hạn, đồng thời giúp việc phát triển ứng dụng Python trở nên dễ dàng và hiệu năng cao như bất kỳ nơi nào khác.

Các tính năng mà chúng tôi nhấn mạnh hôm nay là kết quả của nỗ lực kéo dài nhiều năm này. Nhiều nhà phát triển hiện đã và đang xây dựng ứng dụng trong Python Workers; hôm nay, chúng tôi đưa các khả năng này trở nên sẵn sàng cho môi trường thực tế (production-ready) đối với tất cả mọi người.

Python hiện là ngôn ngữ hạng nhất trong runtime của Cloudflare Workers

Python Workers hiện hỗ trợ nguyên bản (natively) các binding của Cloudflare Developer Platform. Trước đây, việc sử dụng các binding này trong Python Workers đòi hỏi phải chuyển đổi thủ công các đối tượng Python sang đối tượng TypeScript tại ranh giới RPC. Ví dụ, việc gửi một dictionary Python vào một Cloudflare Queue đòi hỏi đoạn mã trung gian sau để hoạt động:

Điều này buộc các nhà phát triển Python phải luôn lưu tâm đến môi trường và mã nguồn JavaScript khi viết Python Workers, và đây là nguồn gốc gây lỗi phổ biến cho cả con người lẫn các tác nhân AI. Để giải quyết vấn đề này, chúng tôi đã đóng gói toàn bộ quá trình chuyển đổi kiểu dữ liệu bên trong runtime của Workers và Python SDK. Điều này cho phép bạn sử dụng tất cả các binding của Cloudflare theo cách thức đặc trưng của Python (Pythonic) mà không cần viết một dòng mã JavaScript nào, giúp đoạn mã sau hoạt động ngay lập tức:

Các web framework: FastAPI, Django và Flask

Giờ đây, bạn có thể chạy framework Python yêu thích của mình như FastAPI, Django hoặc Flask để xây dựng một API server trong Python Workers. Chúng tôi đã triển khai một trình kết nối tích hợp sẵn để bạn có thể dễ dàng kết nối ứng dụng web của mình với Python Workers.

Giả sử bạn có một ứng dụng web FastAPI đơn giản:

Trong các môi trường nguyên bản, bạn sẽ sử dụng một web server như uvicorn để chạy ứng dụng này.

Trong Python Workers, bạn có thể chạy cùng ứng dụng đó bằng cách sử dụng gói workers.asgi mà chúng tôi cung cấp, chỉ cần thêm đoạn mã này vào code của bạn:

Tương tự, bạn có thể sử dụng gói workers.wsgi để chạy các ứng dụng web đồng bộ như Django.

Vậy, điều gì diễn ra bên dưới lớp vỏ đó?

Python có một hợp đồng tiêu chuẩn về cách các ứng dụng web giao tiếp với web server, được gọi là Web Server Gateway Interface (WSGI), hoặc phiên bản bất đồng bộ hiện đại của nó là ASGI. Tiêu chuẩn này cho phép các nhà phát triển xây dựng ứng dụng hoàn toàn độc lập với server. Trong triển khai truyền thống, các web server như Uvicorn hoặc Gunicorn chịu trách nhiệm xử lý nhiều kết nối client đồng thời và các luồng (threads) để mở rộng lưu lượng, trong khi các web framework như FastAPI có thể tập trung hoàn toàn vào logic ứng dụng.

Trong Cloudflare Workers, bản thân nền tảng Workers đóng vai trò là web server. Vì mạng lưới toàn cầu của chúng tôi đã xử lý liền mạch việc cân bằng tải và mở rộng vô hạn, chúng tôi không cần phải "phát minh lại bánh xe" bằng cách chạy một server bên trong Python Workers.

Thay vào đó, các trình kết nối workers.asgi và workers.wsgi của chúng tôi đóng vai trò như một cầu nối mỏng, được tối ưu hóa. Chúng chuyển đổi các yêu cầu JavaScript gốc đến thành các cấu trúc WSGI/ASGI tiêu chuẩn mà các ứng dụng Python mong đợi, và truyền phản hồi ngược lại một cách liền mạch với chi phí tài nguyên tối thiểu. Bằng cách này, các nhà phát triển Python có được lợi ích từ cả hai phía: bạn có thể viết và tổ chức mã nguồn bằng các web framework yêu thích, đồng thời để nền tảng Cloudflare Workers tự động mở rộng API của bạn trên toàn cầu mà không cần cấu hình server.

Các trình kết nối này không chỉ dùng được với FastAPI, Django hoặc Flask, mà còn với bất kỳ web framework Python nào sử dụng giao diện WSGI hoặc ASGI.

Bạn có thể tìm thêm thông tin về cách sử dụng từng web framework trong tài liệu của Python Workers.

Sử dụng PostgreSQL và MySQL với Hyperdrive

Nếu bạn đang xây dựng một ứng dụng Python sử dụng các cơ sở dữ liệu quan hệ như PostgreSQL hoặc MySQL, giờ đây bạn có thể tích hợp Hyperdrive vào Python Workers.

Trước đây, Python Workers không hỗ trợ TCP socket, khiến các driver cơ sở dữ liệu không thể sử dụng được. Để hiểu tại sao đây là một rào cản, bạn cần nhìn vào cách WebAssembly vận hành. Các driver cơ sở dữ liệu Python như aiomysql hoặc asyncpg dựa vào module socket của thư viện tiêu chuẩn để thiết lập kết nối. Trong một môi trường tiêu chuẩn, module này thực hiện các lệnh gọi hệ thống POSIX tới hệ điều hành bên dưới. Bên trong sandbox của WebAssembly, các lệnh gọi hệ thống mạng POSIX đó thường là các stub luôn thất bại. Mọi nỗ lực mở một socket tiêu chuẩn đều sẽ thất bại ngay lập tức. Để giải quyết vấn đề này, chúng tôi đã triển khai các lệnh gọi hệ thống socket bằng cách sử dụng API kết nối của Workers.

Khi một driver cơ sở dữ liệu cố gắng mở một kết nối TCP, nó sẽ đi qua trình triển khai lệnh gọi hệ thống socket tùy chỉnh của chúng tôi. Nó chuyển đổi các thao tác socket Python tiêu chuẩn như mở kết nối và đọc byte thành các lệnh gọi JavaScript tương ứng được sử dụng bởi runtime của Workers. Vì quá trình chuyển đổi này diễn ra ở cấp độ lệnh gọi hệ thống, các driver cơ sở dữ liệu của bạn hoàn toàn không cần biết về cách triển khai bên dưới.

Cầu nối socket này chính là thứ giúp việc tích hợp Hyperdrive của chúng tôi trở nên khả thi. Để sử dụng Hyperdrive trong Python Workers, trước tiên hãy kết nối cơ sở dữ liệu của bạn với Hyperdrive và thiết lập binding trong cấu hình Wrangler:

Sau đó, kết nối với Hyperdrive bằng các driver cơ sở dữ liệu mà bạn đã quen thuộc:

Bạn có thể tham khảo tài liệu Hyperdrive Python Workers để tìm hiểu cách sử dụng Hyperdrive trong Python Workers và những gói nào hiện đang được hỗ trợ.

Mở rộng hệ sinh thái gói WebAssembly

Vì Python Workers chạy bên trong sandbox WebAssembly, bất kỳ gói nào có các phần mở rộng C/C++/Rust nguyên bản đều phải được biên dịch chéo (cross-compiled) sang WebAssembly để chạy trong Python Workers. Tuy nhiên, trước đây không có cách tiêu chuẩn nào để biên dịch chéo các gói Python sang WebAssembly. Điều đó có nghĩa là đội ngũ của chúng tôi phải biên dịch và lưu trữ thủ công các gói WebAssembly tùy chỉnh. Điều này hạn chế đáng kể số lượng gói mà bạn thực sự có thể sử dụng trong Python Workers.

Chúng tôi muốn khắc phục điều này và cho phép người dùng sử dụng nhiều loại gói hơn. Tuy nhiên, chúng tôi không muốn chỉ xây dựng các gói chỉ dùng được trong Python Workers, vì điều đó sẽ không mang lại lợi ích cho cộng đồng. Vì Python Workers được xây dựng trên nền tảng Pyodide, chúng tôi muốn hệ sinh thái phát triển theo cách có lợi cho Pyodide và toàn bộ cộng đồng Python-on-WebAssembly.

Để đạt được mục tiêu này, chúng tôi đã đề xuất PEP 783, tiêu chuẩn hóa một nền tảng để chạy Python trong các runtime trình duyệt có tên là PyEmscripten. Sau hơn một năm thảo luận và tinh chỉnh, đề xuất này đã được chấp nhận, cho phép những người duy trì gói xây dựng và xuất bản các gói cho nền tảng PyEmscripten và cung cấp chúng trên tất cả các môi trường triển khai PyEmscripten.

Chúng tôi cũng đã ổn định chuỗi công cụ xây dựng Pyodide hiện có và phát triển nó thành một dạng có thể tiếp cận được với tất cả những người duy trì gói, cho phép các nhà phát triển dễ dàng xây dựng gói cho nền tảng PyEmscripten. Hơn nữa, chúng tôi đã thêm hỗ trợ nền tảng PyEmscripten vào cibuildwheel để giúp những người khác dễ dàng áp dụng hỗ trợ cho nền tảng này hơn.

Mặc dù hệ sinh thái vẫn đang trong quá trình áp dụng tiêu chuẩn này, chúng tôi hy vọng mọi gói Python sẽ có một file wheel hoạt động với WebAssembly trong tương lai. Chúng tôi cũng đang tích cực làm việc với những người duy trì các gói chính để thêm các bản build PyEmscripten. Nếu bạn gặp một gói chưa được hỗ trợ, hãy cho chúng tôi biết trên Discord hoặc GitHub, và đội ngũ của chúng tôi sẽ làm việc để xây dựng gói đó.

Bạn cũng có thể xem bài nói chuyện của chúng tôi tại EuroPython 2026: “Python Everywhere: The State of Python on WebAssembly” để thấy cách chúng tôi hiện thực hóa điều này.

Xây dựng các tác nhân AI và đường ống (pipelines) bằng Python

Hệ sinh thái lớn các gói khoa học dữ liệu và học máy khiến Python trở thành lựa chọn tự nhiên để xây dựng các tác nhân thông minh và đường ống AI. Nhưng việc đưa chúng vào Python Workers trước đây là một thách thức: các thư viện như openai và langchain dựa vào các HTTP client như requests hoặc httpx để giao tiếp với các API bên ngoài. Tuy nhiên, do thiếu sự hỗ trợ cho các thao tác socket cấp thấp trong Python Workers, các HTTP client này không hoạt động bình thường.

Để giải quyết vấn đề này, chúng tôi đã đóng góp vào upstream để đảm bảo các HTTP client này có thể định tuyến các yêu cầu trực tiếp thông qua JavaScript fetch API trong môi trường WebAssembly. Kết hợp với sự hỗ trợ mới của chúng tôi cho các thao tác socket cấp thấp như đã giải thích ở phần trước, điều này giúp toàn bộ ngăn xếp mạng hoạt động liền mạch bên trong Python Workers.

CloudflarePythonServerlessAILập trình
Đọc bài gốc

Bài viết được AI dịch và tổng hợp tự động từ Cloudflare Blog. Liên kết bài gốc ở phía trên. AIHOT.vn luôn dẫn nguồn đầy đủ — nếu bạn thấy điểm cần chỉnh sửa, hãy gửi ý kiến tại trang phản hồi.