2016-10-31 2 views
0

Приведенный ниже код должен вызывать две базы данных одновременно. Я попытался сделать это с помощью 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 

ответ

0

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

print params 

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

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

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

Проблема с параметром может быть устранена этим.

+0

Я удалил SQL так, как вы правильно предложили, но теперь функция заканчивается списком, в котором есть 3 записи пар кортежей, а не только 3 записи в параметре, с которым функция должна вызываться дважды. – Nickpick

+0

Не могли бы вы привести пример вывода, который он теперь создает? – Hannu

+0

Я обновил вопрос – Nickpick

Смежные вопросы