Есть код на Python, который работает с OpenCV библиотекой. Решил попробовать разместить его на Azure Functions, чтобы иметь возможность запускать вычисления параллельно.
Загрузил код в Function App (Consumption plan/Free trial subscription) и сделал несколько тестовых запусков по 2,4,8,16 вызовов одновременно.
Код функции выполняется (судя по логам) ~15 секунд, результаты запусков были такими:
2 запроса - ~30 сек.
4 запроса - ~32 сек.
8 запросов - ~35 сек.
16 запросов - ~60 сек.
Вот выдержка из логов одного из запусков (старт функции и выполнение первой команды разнесены на 50 секунд):
2020-08-28 08:05:48.335 Executing 'Functions.FuncName' (Reason='This function was programmatically called via the host APIs.', Id=6ce3ec9b-6b32-4ec1-80e8-533124fa28bd)
2020-08-28 08:06:37.698 Python HTTP trigger function processed a request.
Входная функция в коде помечена как async:
async def main(req: func.HttpRequest) -> func.HttpResponse:
return func.HttpResponse(await do_work(req))
Я читал документацию и все, что я нашел это:
- A single function app only scales out to a maximum of 200 instances. A single instance may process more than one message or request at a time though, so there isn't a set limit on number of concurrent executions. You can specify a lower maximum to throttle scale as required.
- For HTTP triggers, new instances are allocated, at most, once per second.
, что не очень-то вяжется с результатами запусков.
Собственно вопросы:
1. Почему параллельный запуск 2 функций выполняется по времени примерно столько же сколько и последовательный?
2. Почему параллельный запуск более 8 функций начинает задерживать выполнение?
3. Где-нибудь есть настройки масштабируемости?
4. Может быть использование Azure Functions для Python+OpenCV - не самая лучшая идея? Где еще можно развернуть такую функцию, чтобы иметь возможность параллельного запуска вычислений?