2017-11-10 9 views
0

現在、Python 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私は接続とカーソル(私は私の機能にプッシュ)でマルチプロセッシングを許可していないので、私はpyodbcドライバの問題に遭遇しているようですので、私はこれを得るためにいくつかのコードを書き直す必要があると思います.. 。 –

関連する問題