Как изменить политику цикла событий asyncio при использовании функций Azure?Python

Программы на Python
Anonymous
Как изменить политику цикла событий asyncio при использовании функций Azure?

Сообщение Anonymous »

Я использую функции Azure и Python для подключения к базе данных PostgreSQL. Для этого я хотел бы использовать библиотеку psycopg3 и AsyncConnectionPool.
psycopg требует, чтобы вы изменили политику цикла событий по умолчанию (например, с помощью asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())< /code>), что я и делаю, но все равно получаю ошибки. Я думаю, это связано с тем, что политика asyncio устанавливается до того, как я получаю возможность вызвать asyncio.set_event_loop_policy(). Как я могу обойти это? При необходимости я мог бы использовать неасинхронные соединения, но я предпочитаю использовать асинхронные соединения для повышения производительности.
Код для воспроизведения:
#function_app.py

import azure.functions as func
import psycopg_pool
import json
import asyncio
import os

if os.name == 'nt':
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())

con_str = "host=localhost dbname=test-db user=postgres password=admin"
apool = psycopg_pool.AsyncConnectionPool(
conninfo=con_str,
open = False
)

app = func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION)

async def connect():
await apool.open()
await apool.wait()
print("Connect OK")

@app.route(route="info", auth_level= func.AuthLevel.FUNCTION)
async def info_trigger(req: func.HttpRequest) -> func.HttpResponse:
try:
await connect()
status = {"test": "OK"}
except:
status = {"test": "Not ok"}
return func.HttpResponse(
json.dumps(status),
status_code=200,
mimetype='application/json'
)

if __name__ == "__main__":
asyncio.run(connect())


Если я запускаю function_app.py из командной строки (py function_app.py) Я получаю распечатку «Connect OK», как и ожидалось.
Если я запускаю сервер локально с помощью func host start и отправляю запрос через почтальона, я получаю {test: «Not ok» в качестве ответа, и консоль, с которой я запустил хост, повторяет следующую распечатку:
error connecting in 'pool-1': Psycopg cannot use the 'ProactorEventLoop' to run in async mode. Please use a compatible event
loop, for instance by setting 'asyncio.set_event_loop_policy(WindowsSelectorEventLoopPolicy())'


Подробнее здесь: https://stackoverflow.com/questions/789 ... -functions

Вернуться в «Python»