Среда выполнения Python Workers теперь общедоступна
Два года назад мы представили Python Workers, предоставив возможность запускать приложения на Python в среде выполнения Cloudflare Workers. Наша цель заключалась в том, чтобы сделать написание Workers на Python таким же простым, как и на TypeScript, а экосистему пакетов и фреймворков Python — максимально совместимой «из коробки».
Сегодня среда Python Workers переходит в статус общей доступности (GA).
Что означает GA? Это значит, что Python теперь является полноценным языком первого уровня, полностью поддерживаемым на платформе для разработчиков Cloudflare. Вы можете использовать уже знакомый вам код, библиотеки и шаблоны проектирования на Python и легко подключать их к Workers AI, R2, D1, Hyperdrive, Durable Objects, Queues, Workflows и остальным сервисам платформы Cloudflare. Внутри Python Workers можно также запускать популярные веб-фреймворки Python, такие как FastAPI, Django и Flask. Вы даже можете создать Python Worker внутри другого Worker с помощью Dynamic Workers.
from fastapi import FastAPI, Request
from workers import asgi, WorkerEntrypoint
app = FastAPI()
@app.get("/")
async def root(request: Request):
env = request.scope["env"]
return await env.AI.run(
"@cf/openai/gpt-oss-120b",
{
"instructions": "You are a friendly assistant.",
"input": "What is the origin of the phrase Hello, World?",
},
)
Default = asgi.entrypoint(app)
История создания Python Workers
Добавление поддержки Python в Cloudflare Workers было вполне естественным шагом. Поскольку Workers поддерживает WebAssembly с 2018 года, это предоставило нам идеальную среду для запуска интерпретатора Python, скомпилированного в Wasm. Используя Pyodide, мы смогли быстро обеспечить поддержку широкого спектра приложений на Python в Cloudflare Workers.
Наша цель заключалась в создании первой платформы для бесконечно масштабируемых приложений на Python, которая была бы такой же простой и производительной, как разработка на Python в любой другой среде.
Функции, которые мы представляем сегодня, являются результатом многолетней работы. Многие разработчики уже создают приложения с помощью Python Workers; сегодня мы делаем эти возможности готовыми к работе в продакшене для всех.
Python теперь является языком первого класса в среде выполнения Cloudflare Workers
Python Workers теперь нативно поддерживают привязки (bindings) платформы для разработчиков Cloudflare. Раньше использование этих привязок Cloudflare в Python Workers требовало явного преобразования объектов Python в объекты TypeScript на границе RPC. Например, отправка словаря Python в очередь Cloudflare Queue требовала следующего вспомогательного кода:
from pyodide.ffi import to_js
import js
self.env.QUEUE.send(to_js({"key": "value"}, dict_converter=js.Object.fromEntries))
Из-за этого разработчикам на Python приходилось держать в уме JavaScript-окружение и код при написании Python Workers, что часто становилось источником ошибок как для людей, так и для ИИ-агентов. Чтобы решить эту проблему, мы инкапсулировали весь процесс преобразования типов внутри среды выполнения Workers и SDK Python. Это позволяет использовать все привязки Cloudflare в идиоматичном для Python стиле без написания единой строчки кода на JavaScript, благодаря чему следующий код работает «из коробки»:
self.env.QUEUE.send({"key": "value"})
Веб-фреймворки: FastAPI, Django и Flask
Теперь вы можете запускать свои любимые веб-фреймворки Python, такие как FastAPI, Django или Flask, для создания API-серверов в Python Workers. Мы реализовали встроенный коннектор, который можно использовать для простой интеграции вашего веб-приложения с Python Workers.
Допустим, у вас есть простое веб-приложение на FastAPI:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
message = "Hello, world!"
return {"message": message}
В нативных средах для запуска такого приложения вы бы использовали веб-сервер вроде uvicorn.
$ uvicorn main:app
В Python Workers вы можете запустить то же приложение с помощью предоставляемого нами пакета workers.asgi, просто добавив этот фрагмент в свой код:
from workers import asgi
class Default(WorkerEntrypoint):
async def fetch(self, request):
return await asgi.fetch(app, request, self.env)
# or equivalently
Default = asgi.entrypoint(app)
Аналогичным образом вы можете использовать пакет workers.wsgi для запуска синхронных веб-приложений, таких как Django.
from workers import WorkerEntrypoint, wsgi
from your_django_app.wsgi import app
Default = wsgi.entrypoint(app)
Итак, что происходит «под капотом»?
В Python существует стандартный контракт взаимодействия веб-приложений с веб-серверами — интерфейс WSGI (Web Server Gateway Interface) или его современный асинхронный аналог ASGI. Этот стандарт позволяет разработчикам создавать приложения, полностью независимые от конкретного сервера. При традиционном развертывании такие веб-серверы, как Uvicorn или Gunicorn, отвечают за обработку множества одновременных клиентских подключений и потоков для масштабирования трафика, в то время как веб-фреймворки вроде FastAPI могут полностью сосредоточиться на логике приложения.
В Cloudflare Workers сама платформа Workers выступает в роли веб-сервера. Поскольку наша глобальная сеть уже берет на себя балансировку нагрузки и бесконечное масштабирование, нам не нужно заново изобретать велосипед, запуская отдельный сервер внутри Python Workers.
Вместо этого наши коннекторы workers.asgi и workers.wsgi действуют как тонкий, оптимизированный мост. Они преобразуют входящий нативный запрос JavaScript в стандартные структуры WSGI/ASGI, ожидаемые Python-приложениями, и плавно возвращают ответ обратно с минимальными накладными расходами. Благодаря этому разработчики на Python получают лучшее из обоих миров: вы можете писать и организовывать код с помощью любимых веб-фреймворков, позволяя платформе Cloudflare Workers мгновенно масштабировать ваш API по всему миру без необходимости настраивать сервер.
Эти коннекторы можно использовать не только с FastAPI, Django или Flask, но и с любым веб-фреймворком Python, использующим интерфейс WSGI или ASGI.
Более подробную информацию об использовании каждого веб-фреймворка можно найти в документации по Python Workers.
Использование PostgreSQL и MySQL с Hyperdrive
Если вы создаете приложение на Python с использованием реляционных баз данных, таких как PostgreSQL или MySQL, теперь вы можете интегрировать Hyperdrive в Python Workers.
Раньше Python Workers не поддерживали TCP-сокеты, что делало драйверы баз данных недоступными. Чтобы понять, почему это было препятствием, нужно взглянуть на то, как работает WebAssembly. Драйверы баз данных Python, такие как aiomysql или asyncpg, полагаются на модуль socket из стандартной библиотеки для установления соединений. В стандартной среде этот модуль выполняет системные вызовы POSIX к нижележащей операционной системе. Внутри песочницы WebAssembly эти сетевые системные вызовы POSIX обычно являются заглушками, которые всегда завершаются ошибкой. Любая попытка открыть стандартный сокет немедленно приводила бы к сбою. Чтобы решить эту проблему, мы реализовали системные вызовы сокетов с использованием API connect в Workers.
Когда драйвер базы данных пытается открыть TCP-соединение, оно проходит через нашу реализацию системных вызовов пользовательских сокетов. Она преобразует стандартные операции с сокетами Python (такие как открытие соединения и чтение байтов) в соответствующие вызовы JavaScript, используемые средой выполнения Workers. Поскольку это преобразование происходит на уровне системных вызовов, вашим драйверам баз данных вообще не нужно знать о лежащей в основе реализации.
Именно этот мост сокетов делает возможной нашу интеграцию с Hyperdrive. Чтобы использовать Hyperdrive в Python Workers, сначала подключите базу данных к Hyperdrive и настройте привязку в конфигурационном файле Wrangler:
"hyperdrive": [
{
"binding": "HYPERDRIVE_MYSQL",
"id": "",
}
]
Затем подключитесь к Hyperdrive с помощью привычных вам драйверов баз данных:
import aiomysql
from workers import WorkerEntrypoint
class Default(WorkerEntrypoint):
async def fetch(self, request):
hd = self.env.HYPERDRIVE_MYSQL
conn = await aiomysql.connect(
host=hd.host,
port=int(hd.port),
user=hd.user,
password=hd.password,
db=hd.database,
ssl=None,
)
cur = await conn.cursor()
await cur.execute("SELECT username FROM user")
r = await cur.fetchall()
await cur.close()
conn.close()
Вы можете обратиться к документации по Hyperdrive Python Workers, чтобы узнать, как использовать Hyperdrive в Python Workers и какие пакеты поддерживаются в настоящее время.
Расширение экосистемы пакетов WebAssembly
Поскольку Python Workers работают внутри песочницы WebAssembly, любые пакеты с нативными расширениями на C/C++/Rust должны быть кросс-компилированы в WebAssembly для запуска в Python Workers. Однако раньше не существовало стандартного способа кросс-компиляции пакетов Python в WebAssembly. Это означало, что нашей команде приходилось вручную компилировать и размещать пользовательские пакеты WebAssembly. Это сильно ограничивало количество пакетов, которые вы действительно могли использовать в Python Workers.
Мы хотели исправить это и разрешить пользователям использовать более широкий спектр пакетов. Тем не менее, мы не хотели просто создавать пакеты, пригодные только для Python Workers, так как это не принесло бы пользы сообществу. Поскольку Python Workers созданы на базе Pyodide, мы хотели, чтобы экосистема развивалась таким образом, который принес бы пользу Pyodide и всему сообществу Python-on-WebAssembly.
С этой целью мы предложили PEP 783, который стандартизирует платформу для запуска Python в средах выполнения браузеров под названием PyEmscripten. После более чем года обсуждений и доработок это предложение было принято, что позволяет мейнтейнерам пакетов создавать и публиковать пакеты для платформы PyEmscripten и делать их доступными во всех средах, реализующих PyEmscripten.
Мы также стабилизировали существующий инструмент сборки Pyodide и превратили его в форму, доступную для всех мейнтейнеров пакетов, что позволяет разработчикам легко собирать пакеты для платформы PyEmscripten. Кроме того, мы добавили поддержку платформы PyEmscripten в cibuildwheel, чтобы упростить для других внедрение поддержки платформы PyEmscripten.
Хотя экосистема все еще находится на этапе принятия этого стандарта, мы надеемся, что в будущем каждый пакет Python будет иметь колесо (wheel), работающее с WebAssembly. Мы также активно работаем с основными мейнтейнерами пакетов над добавлением сборок PyEmscripten. Если вы столкнетесь с пакетом, который еще не поддерживается, сообщите нам в Discord или GitHub, и наша команда постарается обеспечить его сборку.
Вы также можете посмотреть наше выступление на EuroPython 2026: «Python везде: состояние Python на WebAssembly», чтобы узнать, как мы это реализовали.
Создание ИИ-агентов и пайплайнов на Python
Обширная экосистема пакетов для науки о данных и машинного обучения делает Python естественным выбором для создания интеллектуальных агентов и ИИ-пайплайнов. Но перенос их в Python Workers исторически представлял собой сложность: такие библиотеки, как openai и langchain, полагаются на HTTP-клиенты вроде requests или httpx для взаимодействия с внешними API. Однако из-за отсутствия поддержки низкоуровневых операций с сокетами в Python Workers эти HTTP-клиенты работали некорректно.
Чтобы решить эту проблему, мы внесли изменения в upstream, гарантирующие, что эти HTTP-клиенты могут направлять запросы напрямую через JavaScript API fetch в средах WebAssembly. В сочетании с нашей новой поддержкой низкоуровневых операций с сокетами, как описано в предыдущем разделе, это заставляет весь сетевой стек работать бесшовно внутри Python Workers.
В результате теперь вы можете запускать такие ИИ-библиотеки, как openai, langchain и mcp, нативно в Python Workers. Вы также можете объединять их с Workers AI для запуска бессерверного инференса на GPU в сети Cloudflare или проксировать запросы через Cloudflare AI Gateway.
Пример ниже демонстрирует способ запуска моделей Worker AI в langchain с использованием пакета langchain-cloudflare:
from langchain_cloudflare import ChatCloudflareWorkersAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from workers import Response, WorkerEntrypoint
class Default(WorkerEntrypoint):
async def fetch(self, request):
prompt = PromptTemplate.from_template(
"In one sentence, describe a great day in the life of an {profession}."
)
llm = ChatCloudflareWorkersAI(
model_name="@cf/meta/llama-3.3-70b-instruct-fp8-fast",
binding=self.env.AI,
max_tokens=64,
)
chain = prompt | llm | StrOutputParser()
result = await chain.ainvoke({"profession": "electrician"})
return Response.json({"result": result})
Что вы можете создать уже сегодня
Мы собрали коллекцию готовых к продакшену паттернов в нашем репозитории python-workers-examples. Вот несколько способов объединения Python Workers с экосистемой Cloudflare.
Асинхронная оркестрация ИИ
Создание полностекового ИИ-приложения часто означает объединение нескольких сервисов, таких как хранилище, очереди и инференс. Этот пример показывает, как создать ИИ-генератор изображений «изображение в изображение» исключительно на Python Workers. Он принимает запросы пользователей, помещает их в очередь Cloudflare Queue и использует Workflows для оркестрации шага генерации изображений через Workers AI, а также сохраняет изображение в бакет R2.

Потоковая обработка в реальном времени с помощью Bluesky Jetstream
Потребление непрерывного потока (firehose) событий реального времени обычно требует выделенного сервера для поддержания соединения. В этом примере мы используем Python Worker для подключения к WebSocket ATProto/Bluesky Jetstream. Обеспечивая это соединение с помощью объекта Durable Object, Python Worker может поддерживать долгоживущее состояние, гарантируя, что соединение WebSocket останется активным.

Дополнительные примеры для изучения
Сервер протокола контекста модели (MCP)
Создайте и разверните MCP-сервер, используя официальный Python-пакет MCP, чтобы предоставить вашим ИИ-ассистентам доступ к периферийным (edge) данным.

Система дополненной генерации (RAG) с Vectorize
Создание RAG-системы с использованием Workers AI и векторной базы данных Cloudflare Vectorize.

Примеры кода на Python в документации для разработчиков Cloudflare
Мы обновили нашу документацию по продуктам Cloudflare, добавив в нее примеры кода на Python. Почти везде, где есть пример кода, показывающий, как что-то сделать на TypeScript, теперь есть и пример кода на Python. Мы по-прежнему намерены включать примеры на Python во все наши продукты. Вы можете переключать фрагменты кода между JavaScript, TypeScript и Python в документации для разработчиков.

Что дальше?
Достижение статуса GA — это только начало. У нас много планов по улучшению Python Workers, включая повышение их производительности и эффективности использования памяти, а также поддержку новых пакетов.
Продолжайте рассказывать нам о том, что вы хотите создавать на Python Workers, а мы продолжим раздвигать границы возможного. Ознакомьтесь с документацией по Python Workers и начните создавать своего первого Python Worker!
