бассейн.apply_async с несколькими параметрами

Приведенный ниже код должен вызывать две базы данных одновременно. Я пытался сделать это с
ThreadPool, но сталкиваются с некоторыми трудностями. бассейн.apply_async, кажется, не позволяет несколько параметров, поэтому я помещаю их в кортеж, а затем пытаюсь распаковать их. Это правильный подход или есть лучшее решение?

Список кортежей определен в params=… и кортежи имеют 3 записи. Я ожидаю, что функция будет вызываться дважды, каждый раз с 3 параметрами.

def get_sql(self, *params):  # run with risk
    self.logger.info(len(params))
    sql=params[0]
    schema=params[1]
    db=params[2]
    self.logger.info("Running SQL with schema: {0}".format(schema))
    df = pd.read_sql(sql, db)
    return df

def compare_prod_uat(self):
    self.connect_dbrs_prod_db()
    self.connect_dbrs_uat_db()
    self.logger.info("connected to UAT and PROD database")

    sql = """ SELECT * FROM TABLE """

    params = [(sql, "DF_RISK_PRD_OWNER", self.db_dbrs_prod), (sql, "DF_RISK_CUAT_OWNER", self.db_dbrs_uat)]
    pool = ThreadPool(processes=2)
    self.logger.info("Calling Pool")
    result_prod = pool.apply_async(self.get_sql, (sql, "DF_RISK_PRD_OWNER", self.db_dbrs_prod))
    result_uat = pool.apply_async(self.get_sql, (sql, "DF_RISK_CUAT_OWNER", self.db_dbrs_uat))

    # df_prod = self.get_sql(sql, "DF_RISK_PRD_OWNER", self.db_dbrs_prod)
    # df_cuat = self.get_sql(sql, "DF_RISK_CUAT_OWNER", self.db_dbrs_uat)


    self.logger.info("Get return from uat")
    df1 = result_uat.get()  # get return value from the database call

    self.logger.info("Get return from prod")
    df2 = result_prod.get()  # get second return value from the database call


    return df1, df2

1 ответ

  1. Там может быть много вещей неправильно, но если добавить

    print params
    

    в первой строке get_sql вы увидите, что отправляете кортеж (sql, [(sql, «DF_RISK_PRD_OWNER», self.db_dbrs_prod), (sql,…..)])

    Так что да, длина парамов всегда равна двум, первый параметр является » sql » независимо от того, что находится в вашей реализации, а второй массив кортежей длины три. Я не понимаю, почему вы отправляете (sql, params) вместо просто (params,), поскольку «sql», кажется, есть в элементах массива. Если он должен быть там, Ваш массив находится в params[1].

    Однако я не понимаю, как ваша рабочая функция будет пересекать этот массив. Похоже, что он построен для выполнения только одной инструкции sql, поскольку у него нет цикла for. Может быть, вы намеревались сделать цикл for в своей функции compare_prod_uat и породить столько работников, сколько у вас есть элементов в массиве? Я не знаю, но в настоящее время это не имеет большого смысла.

    Проблема параметра может быть исправлена этим, хотя.