2017-09-26 8 views
0

파이썬을 사용하여 하나의 mysql 데이터베이스에서 다른 데이터베이스로 데이터를 파이프합니다. 여기에 꽤 잘 근무하고 나는 몇 달 동안 사용 된 코드 가볍게 추상화 된 버전입니다 :다중 처리. 동시 프로세스를 실행하여 mysqldump에서 데이터를 파이프 처리하는 풀

def copy_table(mytable): 
    raw_mysqldump = "mysqldump -h source_host -u source_user --password='secret' --lock-tables=FALSE myschema mytable" 
    raw_mysql = "mysql -h destination_host -u destination_user --password='secret' myschema" 

    mysqldump = shlex.split(raw_mysqldump) 
    mysql = shlex.split(raw_mysql) 

    ps = subprocess.Popen(mysqldump, stdout=subprocess.PIPE) 
    subprocess.check_output(mysql, stdin=ps.stdout) 
    ps.stdout.close() 
    retcode = ps.wait() 
    if retcode == 0: 
     return mytable, 1 
    else: 
     return mytable, 0 

데이터의 크기는 성장했다, 그리고 그것은 현재 30 같은 것을 복사 한 시간 정도 소요 테이블. 일들을 빠르게 진행하기 위해 멀티 프로세싱을 활용하고 싶습니다. t2.micro (AWS EC2) 인 우분투 서버에서 다음 코드를 실행하려고합니다.

def copy_tables(tables): 
    with multiprocessing.Pool(processes=4) as pool: 
     params = [(arg, table) for table in sorted(tables)] 
     results = pool.starmap(copy_table, params) 
    failed_tables = [table for table, success in results if success == 0] 
    all_tables_processed = False if failed_tables else True 
    return all_tables_processed 

문제는 : 거의 모든 테이블의 복사되지만, 그 이상 왼쪽 자식 프로세스의 부부가 완료되지 않습니다 항상있다 - 그들은 단지 걸어, 나는 데이터베이스를 모니터링에서 볼 수있는 자료 없음 전송 중입니다. 부모 프로세스와 어떻게 든 연결이 끊어 졌거나 데이터가 제대로 반환되지 않는 것 같습니다.

이것은 첫 번째 질문이며, 어떤 도움을 주셔서 감사합니다. 자세한 정보를 제공 할 수 있는지 알려 주시기 바랍니다.

답변

1

나는

ps = subprocess.Popen(mysqldump, stdout=subprocess.PIPE) 
subprocess.check_output(mysql, stdin=ps.stdout) 
ps.stdout.close() 
retcode = ps.wait() 

가 mysqldump는 프로세스가 완료 될 때까지 당신은 파이프를 닫지한다

ps = subprocess.Popen(mysqldump, stdout=subprocess.PIPE) 
sps = subprocess.Popen(mysql, stdin=ps.stdout) 
retcode = ps.wait() 
ps.stdout.close() 
sps.wait() 

해야 다음 코드를 생각한다. check_output이 블로킹 중이며, stdin이 끝날 때까지 정지합니다.

+0

감사합니다. 나는이 변화를 관찰 해 보았습니다. stdout.close()의 목적을 이해합니다. 자식 프로세스가 종료되면 SIGINT를 부모 프로세스로 반환해야합니다. – speedyturkey

+1

@speedyturkey 제 잘못입니다. check_output이 (가) 호출을 차단하고 있습니다. Popen이어야합니다. – hailinzeng

+0

초기 결과는 여기서 유망 해 보입니다. 환상적인 대답, 고마워요! – speedyturkey