2017-11-10 2 views
0

현재 파이썬 pdfkit 및 jinja를 사용하여 PDF 보고서를 생성하는 도구를 작성 중입니다.멀티 스레딩을 사용하는 python dict 빌드

이 보고서는 많은 정적 HTML과 보고서 용 데이터 및 이미지 (차트)를 생성하는 약 30 개의 함수를 기반으로합니다. 이 함수는 모두 pyodbc 또는 pandas from_sql을 통해 외부 데이터에 액세스합니다.

현재 성능 문제가 발생하고 있으며 보고서 작성에는 약 5 분이 소요됩니다.

데이터 사전을 작성하기 위해 멀티 스레딩을 활용하고 싶지만 문제에 접근하는 방법을 파악하지 못했습니다.

현재 코드는 다음과 같습니다.

def buildReport(): 

    if checkKvaegCVR(SQL = checkKvaegCVRSQL(cvrNummer = cvrNummer), cursor = OEDBCursor): 

     env = Environment(loader=FileSystemLoader('.')) 
     template = env.get_template("templates/kvaeg/kvaegBase.html") 

     pdfOptions = { 
      'page-size': 'A4', 
      'margin-top': '0.75in', 
      'margin-right': '0.75in', 
      'margin-bottom': '0.75in', 
      'margin-left': '0.75in', 
      'quiet': '', 
      'encoding': "UTF-8", 
      'footer-right': '[page]' 
     } 

     css = 'static/css/style.css' 

     template_vars = {'kvaegForsideBillede': imageBuilder()['kvaegForsideBillede'], 
         'bagsideBillede': imageBuilder()['bagsideBillede'], 
         'navn' : bedriftAdresse(cvrNummer = cvrNummer, 
               cursor = KundeAnalyseDBCursor)[0], 
         'adresse' : bedriftAdresse(cvrNummer = cvrNummer, 
               cursor = KundeAnalyseDBCursor)[1], 
         'postnrBy' : str(int(bedriftAdresse(cvrNummer = cvrNummer, cursor = KundeAnalyseDBCursor)[2])) + ' ' + 
              bedriftAdresse(cvrNummer = cvrNummer, cursor = KundeAnalyseDBCursor)[3], 
         'fremstillingsprisKorr': imageBuilder()['fremstillingsprisKorr'], 
         'fremstillingsprisForbedring':imageBuilder()['fremstillingsprisForbedring'], 
         'graesoptagelse':kgGraesPrKo(), 
         'indreSaedskifteKort':indreSaedskifteKortPNG(CVRPunkt = CVRPunkt(cvrNummer, KundeAnalyseDBCursor), 
                    CVRBuffer = CVRBuffer(cvrNummer, KundeAnalyseDBCursor), 
                    indreSaedskifteKort = indreSaedskifteKort(indreSaedskifteKortSQL = indreSaedskifteKortSQL(cvrNummer = cvrNummer), cursor = KundeAnalyseDBCursor)), 
         'naboKort':naboKortPNG(CVRPunkt = CVRPunkt(cvrNummer = cvrNummer, cursor = KundeAnalyseDBCursor), 
               CVRBuffer = CVRBuffer(cvrNummer = cvrNummer, cursor = KundeAnalyseDBCursor), 
               naboKort = naboKort(naboMarkerSQL = naboMarkerSQL(cvrNummer = cvrNummer), 
                    egneMarkerSQL = egneMarkerSQL(cvrNummer = cvrNummer), 
                    cursor = KundeAnalyseDBCursor)) 
         ... 
         ... 
         30 more functions here 
         ... 
         ...} 

     pdfkit.from_string(template.render(template_vars), 'KvaegRapport - {}.pdf'.format(cvrNummer), options=pdfOptions, css=css) 
     print('Rapporten er klar') 
    else: 
     print('Kan ikke bygge rapport på dette CVR nummer') 
(아마 내 주요 기능을 외부) 내가 멀티 스레딩을 사용하여 사전 "Template_vars"를 구축하고자하는

어떤 제안이?

+0

당신은'threading' 모듈을 사용하여 도움이 필요합니까? 아니면'dict'에 대한 멀티 스레드 접근에 관심이 있습니까? – birryree

+0

기본적으로 나에게 약간의 블랙 박스가 있기 때문에이 시나리오에서 멀티 스레딩 모듈을 사용하는 방법에 대한 약간의 도움이 필요합니다. –

답변

1

나는 (코드가 테스트되지 않음) 다음하지만 멀티로 제안 할 수있다 :

from multiprocessing import Process, Queue 


def make_smth(func, queue, name, *args, **kwargs): 
    queue.put((name, func(*args, **kwargs))) 


result_queue = Queue() 
processes = list() 
processes.append(
    Process(target=make_smth, 
      args=(bedriftAdresse, result_queue, "navn"), 
      kwargs={cvrNummer: cvrNummer, cursor: KundeAnalyseDBCursor[0]} 
    ) 
) 
processes.append(
    Process(target=make_smth, 
      args=(kgGraesPrKo, result_queue, "graesoptagelse"), 
      kwargs={} 
    ) 
) 
#...... You should do it for each of your functions 

for p in processes: 
    p.start() 

template_vars = {} 
result = result_queue.get() 
while result: 
    template_vars[result[0]] = result[1] 
    result = result_queue.get() 
+0

피드백에 감사드립니다. Unfourtunately 연결 및 커서 (내 함수 밖으로 밀어) 다중 처리를 허용하지 않기 때문에 Unfourtunately 문제가 pyodbc 드라이버를 실행하는 것 같다 그래서 내가이 작업을 얻으려면 일부 코드를 다시 작성해야 할 것 같아요 .. . –

관련 문제