Приведенный ниже код должен вызывать две базы данных одновременно. Я попытался сделать это с помощью ThreadPool, но столкнулся с некоторыми трудностями. pool.apply_async, похоже, не допускает нескольких параметров, поэтому я помещаю их в кортеж, а затем пытаюсь распаковать их. Это правильный подход или есть лучшее решение?pool.apply_async с несколькими параметрами
Список кортежей определен в params = ... и кортежи имеют 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
Я удалил SQL так, как вы правильно предложили, но теперь функция заканчивается списком, в котором есть 3 записи пар кортежей, а не только 3 записи в параметре, с которым функция должна вызываться дважды. – Nickpick
Не могли бы вы привести пример вывода, который он теперь создает? – Hannu
Я обновил вопрос – Nickpick