Запустите функцию класса в фоновом режиме и получите ее статус - PullRequest
0 голосов
/ 01 мая 2018
import threading
from azure.storage.blob import BlockBlobService

def do_other_stuff():
    print("so much stuff to do")

class ABlob:
    def __init__(self, account_name, account_key, container_name, blob_name, file_path):
        self.account_name = account_name
        self.account_key = account_key
        self.container_name = container_name
        self.blob_name = blob_name
        self.file_path = file_path
        self.blob_service = BlockBlobService(account_name=self.account_name, account_key=self.account_key)

    def get_blob(self):
        download_thread = threading.Thread(
            target=self.blob_service.get_blob_to_path,
            args=(self.container_name, self.blob_name, self.file_path))
        download_thread.start()

    def get_blob_name(self):
        print(self.blob_name)


first_blob = ABlob(account_name='account_name',
                   account_key='key',
                   container_name='container', blob_name='something.csv',
                   file_path='path')


first_blob.get_blob()
first_blob.get_blob_name()
do_other_stuff()

У меня есть BLOB-объекты Azure, которые необходимо загрузить и загрузить (не показано). Я не хочу ждать, пока они завершат свой процесс, поскольку у меня есть другие вещи, которые должны быть сделаны. Однако в какой-то момент мне нужно будет подтвердить, что они успешно загружены или загружены.

С моим текущим кодом я использовал библиотеку потоков. Если в процессе загрузки или выгрузки произошла ошибка, поток, обрабатывающий транзакцию, завершится с ошибкой. У меня нет возможности сообщить основной ветке завершения и статус завершения.

Что мне нужно сделать, чтобы получить статус get_blob? Есть ли другая библиотека, которая имеет менее опасный способ справиться с этой ситуацией? Я ссылался на следующие темы, но не могу понять, как объединить их разные подходы.

Перехватить исключение потока в потоке вызывающего в Python

попытки многопроцессорного пула Python

Как вызвать асинхронную функцию, содержащуюся в классе

фоновая функция в Python

1 Ответ

0 голосов
/ 02 мая 2018

Что мне нужно сделать, чтобы получить статус get_blob?

Вы можете заключить get_blob в функцию, которая будет хранить информацию о том, удалось ли это, и сохранять возвращаемое значение, если оно есть. Вместо target=self.blob_service.get_blob_to_path вы можете написать target=self._get_blob_background. Новый метод _get_blob_background может вызывать self.result = self.blob_service.get_blob_to_path и использовать try и except Exception as e для перехвата всех исключений и, в случае исключения, выполнить self.result_exception = e, чтобы основной поток мог отличить результат от исключения.

Еще лучше, вы можете использовать библиотеку concurrent.futures, чтобы сделать все это за вас:

pool = concurrent.futures.ThreadPoolExecutor()

def get_blob(self):
    return pool.submit(self.blob_service.get_blob_to_path,
                       self.container_name, self.blob_name, self.file_path)

Теперь get_blob() будет работать в фоновом режиме, как в вашем коде, но здесь он вернет объект Future, который вы можете запросить, чтобы выяснить, выполнено ли задание и как оно завершено .

...