使用多线程构建python dict
我目前正在使用PythonPDFKIT和jinja构建一个生成PDF报告的工具 此报告基于大量静态html和大约30个函数构建,这些函数为报告生成数据和图像(图表)。这些函数都通过pyodbc或pandas从_sql访问外部数据 我现在遇到了性能问题,生成报告大约需要5分钟 我希望利用多线程来构建一个数据字典,但还没有弄清楚如何解决这个问题 我当前的代码看起来像这样使用多线程构建python dict,python,multithreading,dictionary,pdfkit,Python,Multithreading,Dictionary,Pdfkit,我目前正在使用PythonPDFKIT和jinja构建一个生成PDF报告的工具 此报告基于大量静态html和大约30个函数构建,这些函数为报告生成数据和图像(图表)。这些函数都通过pyodbc或pandas从_sql访问外部数据 我现在遇到了性能问题,生成报告大约需要5分钟 我希望利用多线程来构建一个数据字典,但还没有弄清楚如何解决这个问题 我当前的代码看起来像这样 def buildReport(): if checkKvaegCVR(SQL = checkKvaegCVRSQL(c
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”
有什么建议吗?我可以提出以下建议,但对于多处理(以下代码尚未测试):
使用
线程化模块需要帮助吗?或者您是否关心dict的多线程访问?基本上,这对我来说有点像一个黑匣子,所以是的,我需要一些关于如何在此场景中使用多线程模块的帮助谢谢您的反馈。不幸的是,我似乎遇到了pyodbc驱动程序的问题,因为它不允许对连接和游标进行多处理(我将其推送到我的函数中),所以我想我必须重新编写一些代码才能使其正常工作。。。
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()