Асинхронные обработчики в Python 3.14 в Yandex Cloud
В предыдущих версиях Python рантайма в Yandex Cloud Serverless Functions асинхронные обработчики поддерживались прозрачно.
Достаточно было объявить функцию-обработчик как
async def и использовать await внутри нее, и все работало без проблем.
Проблема
Однако в Python 3.14 произошли изменения в механизме получения event loop, если он не был явно инициализирован.

Начиная с Python 3.14, если вызвать asyncio.get_event_loop() без предварительной инициализации, будет выброшено
исключение RuntimeError.
Пример ошибки из serverless функции:
{
"errorMessage": "There is no current event loop in thread 'MainThread'.",
"errorType": "RuntimeError",
"stackTrace": [
" File \"/function/runtime/runtime.py\", line 233, in handle_event\n result = asyncio.get_event_loop().run_until_complete(result)\n",
" File \"/function/runtime/lib/python3.14/asyncio/events.py\", line 715, in get_event_loop\n raise RuntimeError('There is no current event loop in thread %r.'\n"
]
}
Решение
Вам нужно явно инициализировать event loop в вашем коде. Это можно
сделать с помощью asyncio.new_event_loop() и asyncio.set_event_loop(), а затем использовать run_until_complete()
для выполнения асинхронного обработчика.
import asyncio
import json
async def async_handler():
await asyncio.sleep(1) # Пример асинхронной операции
return {
'statusCode': 200,
'body': {
'message': 'Ok',
}
}
def handler(event, context):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
return loop.run_until_complete(async_handler())
В качестве точки входа в функцию используйте синхронный обработчик index.handler, который инициализирует event
loop и вызывает асинхронный обработчик async_handler и уже в нем можно использовать await для выполнения асинхронных
операций.