2016-10-31 10 views
0

以下のコードは、同時に2つのデータベースを呼び出す必要があります。私は ThreadPoolでやろうとしましたが、少し難しかったです。 pool.apply_asyncは複数のパラメータを許可していないようですので、それらをタプルに入れて解凍しようとします。これは正しいアプローチですか、それともよりよい解決策ですか?複数のパラメータを持つpool.apply_async

タプルのリストはparams = ...で定義され、タプルは3つのエントリを持ちます。私は関数が3回のパラメータで2回呼び出されると期待します。

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

あり間違っている多くのものか​​もしれないが、あなたがGET_SQLの最初の行として

print params 

を追加した場合、あなたはタプル(SQL、[(SQL、に送ることがわかります"DF_RISK_PRD_OWNER"、self.db_dbrs_prod)、(sql、.....)])

したがって、paramsの長さは常に2であり、最初のパラメータは実装に含まれる「sql」であり、 2番目は長さ3のタプルの配列です。私はなぜあなたが(SQL、params)の代わりに単に(params)を送信しているのか分からない "sql"が配列要素にあるようだ。そこに存在する必要がある場合、配列はparams [1]にあります。

しかし、あなたのワーカー関数がこの配列をどのようにトラバースするかはわかりません。これはforループを持たないため、1つのSQL文だけを実行するように構築されているようです。あなたのcompare_prod_uat関数でforループを行い、配列に要素を持つのと同じ数のワーカーを生成しようとしたのでしょうか?私は知らないが、現在はあまり意味がない。

パラメータの問題はこれで修正できます。

+0

私はあなたが正しく提案したとおりにSQLを削除しましたが、関数は2回呼び出される必要があるparamの3つのエントリの代わりに3組のタプルのエントリを持つリストで終了します。 – Nickpick

+0

今作成した出力の例を教えてください。 – Hannu

+0

私は今質問 – Nickpick

関連する問題