У меня есть приложение Python, работающее на встроенном устройстве Linux. Приложение запускает асинхронный код, который подключает клиент устройства iothub. У меня есть класс под названием Device_client_wrapper, который использует семафор, чтобы гарантировать, что только одна функция вызывает методы клиента устройства за раз, так как это вызывало мне проблемы. < /P>
Я только что добавил новую функцию к Этот класс, который используется для загрузки файлов с устройства в хранилище Azure Blob. Некоторое время он работал нормально и часто работает в первый раз, но потом, если я выполняю его слишком много раз, я получаю следующую ошибку: < /p>
ERROR upload_file Exception: Unexpected failure
ERROR Traceback (most recent call last):
File "/usr/lib/python3.10/site-packages/azure/iot/device/iothub/aio/async_clients.py", line 33, in handle_result
return await callback.completion()
File "/usr/lib/python3.10/site-packages/azure/iot/device/common/async_adapter.py", line 91, in completion
return await self.future
azure.iot.device.exceptions.ServiceError: HTTP operation returned: 403 TooManyDevicesError(Error: Forbidden)
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/root/cogo_ig60/cloud/device_client_wrapper.py", line 99, in upload_file
blob_info = await self.device_client.get_storage_info_for_blob(blob_name)
File "/usr/lib/python3.10/site-packages/azure/iot/device/iothub/aio/async_clients.py", line 571, in get_storage_info_for_blob
storage_info = await handle_result(callback)
File "/usr/lib/python3.10/site-packages/azure/iot/device/iothub/aio/async_clients.py", line 57, in handle_result
raise exceptions.ClientError("Unexpected failure") from e
azure.iot.device.exceptions.ClientError: Unexpected failure
< /code>
Это функция, вызывающая ошибку: < /p>
async def upload_file(self, path_to_file: str, blob_name: str):
"""Upload a file to Azure Blob Storage."""
try:
async with self.semaphore:
blob_info = await self.device_client.get_storage_info_for_blob(blob_name)
sas_url = "https://{}/{}/{}{}".format(
blob_info["hostName"],
blob_info["containerName"],
blob_info["blobName"],
blob_info["sasToken"]
)
logger.info(
f"Uploading file {path_to_file} to blob storage as {blob_name}")
with BlobClient.from_blob_url(sas_url) as blob_client:
with open(path_to_file, "rb") as f:
result = blob_client.upload_blob(f, overwrite=True)
return (True, result)
except FileNotFoundError as e:
# catch file not found and add an HTTP status code to return in notification to IoT Hub
logger.error(f'upload_file FileNotFoundError: {e}')
logger.error(traceback.format_exc())
e.status_code = 404
return (False, e)
except AzureError as e:
# catch Azure errors that might result from the upload operation
logger.error(f'upload_file AzureError: {e}')
logger.error(traceback.format_exc())
return (False, e)
except Exception as e:
# catch all other errors
logger.error(f'upload_file Exception: {e}')
logger.error(traceback.format_exc())
return (False, e)
< /code>
Это кажется проблемой с Device_client.get_storage_info_for_blob. Я знаю, что есть максимум из 10 одновременных загрузки файлов на устройство, но я загружаю 7 Fiiles, затем они завершают загрузку успешно, прежде чем я попробую еще раз. Несмотря на это, с помощью семафора он должен предотвратить любые параллельные загрузки файлов. Это если я не упускаю что -то в том, как работает мой код. > Это Python 3.10.4 кстати.
Подробнее здесь: https://stackoverflow.com/questions/753 ... viceserror
Функция Python для загрузки файлов в сбой с хранением с 403 ToomanyDeviceserror ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение