2016-10-31 9 views
0

아래 코드는 동시에 두 개의 데이터베이스를 호출해야합니다. 나는 ThreadPool로 해보려고했지만 약간 어려움에 처해있다. pool.apply_async는 여러 개의 매개 변수를 허용하지 않는 것 같습니다. 따라서 튜플에 넣은 다음 풀어 봅니다. 이것이 올바른 접근 방법입니까 아니면 더 나은 해결책입니까?여러 매개 변수가있는 pool.apply_async

튜플 목록은 params = ...에 정의되어 있으며 튜플에는 3 개의 항목이 있습니다. 3 번 매개 변수를 사용할 때마다 함수를 두 번 호출해야합니다. 당신이 당신의 get_sql의 첫 번째 라인으로

print params 

을 추가하는 경우

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

, 당신은 당신이 (튜플에 SQL, [(SQL을 보낼 것을 볼 수있다 많은 것들이 잘못 될 수 있지만, "DF_RISK_PRD_OWNER", self.db_dbrs_prod), (sql, .....)])

그렇습니다. params의 길이는 항상 2이며, 첫 번째 매개 변수는 구현에 어떤 것이 든 "sql"이고, 두 번째는 길이가 3 인 튜플의 배열입니다. 나는 "sql"이 배열 요소에있는 것처럼 보이는 이유를 (params) 대신 (sql, params)를 보내는 이유를 이해하지 못합니다. 거기에 있어야하는 경우 배열은 params [1]에 있습니다.

그러나 작업자 함수가이 배열을 통과하는 방식을 이해하지 못합니다. for 루프가 없으므로 하나의 sql 문만 실행하도록 작성된 것 같습니다. 어쩌면 compare_prod_uat 함수에서 for 루프를 수행하고 배열에 요소가있는만큼 작업자를 생성하려고했을 것입니다. 나는 모르지만 현재는별로 의미가 없다.

매개 변수 문제는 이것으로 해결할 수 있습니다.

+0

당신이 제안한대로 SQL을 제거했지만 이제는 함수가 두 번 호출되어야하는 param의 단 3 개의 항목 대신 3 개의 튜플 쌍 항목이있는 목록으로 끝납니다. – Nickpick

+0

지금 생성하는 출력의 예를 들려 줄 수 있습니까? – Hannu

+0

나는 이제 – Nickpick

관련 문제