Python: предупреждение о незакрытом сеансе клиента при загрузке большого двоичного объекта из асинхронного ADL Gen 2

У меня есть приложение-функция Azure, которое считывает большие двоичные объекты, а затем обрабатывает их. Я получаю это предупреждение Unclosed client session

Main вызывает функцию getblob, используя await

import logging
from ..shared import blobOpsAIO
import azure.functions as func
import pandas as pd
from ..shared import invOps
import sys, os

async def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    try:
        req_body = req.get_json()
        file_name_path = req_body.get("file_name_path", "")
        file_name = req_body.get("file_name", "")
        account_id = req_body.get("account_id", "")

        inv = await getBlob(file_name_path, file_name, container_name=account_id)

        #process inv

Загрузка файла получить блоб:

async def getBlob(blobPathName, LOCALFILENAME, dtype_param = None, container_name = 'somevalue', blob_type = 'csv', encoding='UTF-8', skiprows=0, header=0, sep=','):

        df = pd.DataFrame()
        # some validations   
        df = await read_blob_content(connection_string, container_name, blobPathName, blob_type, LOCALFILENAME, dtype_param, encoding, skiprows, header, sep)
        # do something with df
        return df
async def read_blob_content(connection_string, container_name, blob_name, blob_type, LOCALFILENAME, dtype_param, encoding, skiprows=0, header=0, sep = ","):

                async with aiohttp.ClientSession() as session:
                    blob_client = BlobClient.from_connection_string(
                        conn_str=connection_string,
                        container_name=container_name,
                        blob_name=blob_name
                    )
                    print(f'Going to fetch blobPathName: {blob_name}')
                    blob_data = await blob_client.download_blob()
                    async with aiofiles.open(LOCALFILENAME, "wb") as my_blob:
                        data = await blob_data.readall()
                        await my_blob.write(data)
                    await session.close()    # also tried placing this line one level up in the identation 
                success = True
            

            #open the file using pandas and process
                
        return df
    except Exception as e:
        print(str(e))
        raise e

Я пытался добавить/удалить await session.close(), но безуспешно. Также размещение строки на том же уровне идентификации, что и async with aiohttp.ClientSession() as session.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я могу получить ожидаемый результат без какого-либо предупреждающего сообщения, используя приведенный ниже код.

import logging
import azure.functions as func
import pandas as pd
import aiohttp
import aiofiles
from azure.storage.blob import BlobClient

connection_string='*********';

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

@app.route(route = "http_trigger")
async def http_trigger(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    try:
        req_body = req.get_json()
        file_name_path = req_body.get('file_name_path')
        file_name = req_body.get('file_name')
        account_id = req_body.get('account_id')

        inv = await get_blob(file_name_path, file_name, container_name=account_id)

        # Process inv
        return func.HttpResponse(f"File {file_name} downloaded and processed successfully!", status_code=200)
    
    except Exception as e:
        logging.error(str(e))
        return func.HttpResponse("An error occurred while processing the request.", status_code=500)

async def get_blob(file_name_path, file_name, dtype_param=None, container_name='test', blob_type='csv', encoding='UTF-8', skiprows=0, header=0, sep=','):
    df = pd.DataFrame()
    
    try:
        df = await read_blob_content(
            connection_string,
            container_name, file_name, blob_type, file_name_path, dtype_param, encoding, skiprows, header, sep
        )
    except Exception as e:
        logging.error(str(e))
        raise e
    
    # Process the dataframe
    return df

async def read_blob_content(connection_string, container_name, blob_name,blob_type, file_name_path, dtype_param, encoding, skiprows=0, header=0, sep = ","):
    try:
        async with aiohttp.ClientSession() as session:
            blob_client = BlobClient.from_connection_string(
                conn_str=connection_string,
                container_name=container_name,
                blob_name=blob_name
            )
            logging.info(f'Going to fetch blobPathName: {blob_name}')
            blob_data = blob_client.download_blob()
            async with aiofiles.open(file_name_path, mode='wb') as my_blob:
                data = blob_data.readall()
                await my_blob.write(data)
    except Exception as e:
        logging.error(str(e))
        raise e
    
    # Read the file using pandas and process
    df = pd.read_csv(file_name_path, dtype=dtype_param, encoding=encoding, skiprows=skiprows, header=header, sep=sep)
    
    return df

требования.txt

azure-functions
pandas
aiohttp
aiofiles
azure-storage-blob
  • Blob загружается локально.

Другие вопросы по теме