Python 在后台运行类函数并检索其状态

Python 在后台运行类函数并检索其状态,python,multithreading,asynchronous,python-multithreading,python-asyncio,Python,Multithreading,Asynchronous,Python Multithreading,Python Asyncio,我有需要下载和上传的Azure Blob(未显示)。我不想等待他们完成他们的过程,因为我还有其他事情要做。不过,在某个时候,我需要确认他们是否已成功下载或上传 在我当前的代码中,我使用了线程库。如果上传或下载过程中发生错误,处理事务的线程将退出并出错。我无法通知主线程的完成情况和完成状态 我需要做什么才能获取get\u blob的状态?有没有另一个图书馆处理这种情况的方法不那么危险?我引用了以下线程,但无法理解如何组合它们的不同方法 我需要做什么才能获取get\u blob的状态 您可以

我有需要下载和上传的Azure Blob(未显示)。我不想等待他们完成他们的过程,因为我还有其他事情要做。不过,在某个时候,我需要确认他们是否已成功下载或上传

在我当前的代码中,我使用了线程库。如果上传或下载过程中发生错误,处理事务的线程将退出并出错。我无法通知主线程的完成情况和完成状态

我需要做什么才能获取
get\u blob
的状态?有没有另一个图书馆处理这种情况的方法不那么危险?我引用了以下线程,但无法理解如何组合它们的不同方法

我需要做什么才能获取
get\u blob
的状态

您可以将
get_blob
包装到一个函数中,该函数将存储有关它是否成功的信息,并存储返回值(如果有的话)。您可以编写
target=self.\u get\u blob\u background
,而不是
target=self.blob\u service.get\u blob\u to\u path
。新的
\u get\u blob\u background
方法可以调用
self.result=self.blob\u服务。get\u blob\u到\u path
并使用
try
Exception as e
捕获所有异常,如果出现异常,则执行
self.result\u Exception=e
,以便主线程能够区分结果和异常

更好的是,您可以使用
concurrent.futures
库为您完成所有这些:

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()

现在,
get\u blob()
将在后台运行,就像在代码中一样,但在这里它将返回一个对象,您可以查询该对象以了解作业是否完成,以及它是如何完成的。

我曾考虑过您的第一种方法,但认为它可能过于草率。
concurrent\u futures
库绝对是我想要的。我的类的每个实例都有一个池对象,这有什么后果吗?或者池的级别应该高于每个实例的级别。@执行者维护线程或进程池,根据需要生成和销毁它们。如果为每个实例创建一个执行器,您将负责调用执行器上的
close()
,以确保删除其线程。此外,每次调用时都会产生一个新线程,线程池通常设计用于阻止该调用以提高效率。
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)