Почему многопроцессорность не работает с Python Dash Framework - Python3.6 - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь реализовать многопроцессорную библиотеку для разделения фрейма данных на части, обработки его на нескольких ядрах ЦП и последующего объединения результатов обратно в конечный фрейм данных в приложении Python Dash.Код работает нормально, когда я пробую его вне приложения dash (когда я запускаю код автономно, не заключая его в приложение dash).Но когда я добавляю тот же код в приложение-черту, я получаю сообщение об ошибке.Я показал код ниже:

Я пробовал многопроцессорный код из Dash Framework, и он работает абсолютно нормально.

import dash
from dash.dependencies import Input, Output, State
import dash_core_components as dcc
import dash_html_components as html
import flask
import dash_table_experiments as dt
import dash_table
import dash.dependencies

import base64
import time
import os

import pandas as pd

from docx import *
from docx.text.paragraph import Paragraph
from docx.text.paragraph import Run
import xml.etree.ElementTree as ET


import multiprocessing as mp
from multiprocessing import Pool

from docx.document import Document as doctwo
from docx.oxml.table import CT_Tbl
from docx.oxml.text.paragraph import CT_P
from docx.table import _Cell, Table
from docx.text.paragraph import Paragraph
import io
import csv
import codecs
import numpy as np

app = dash.Dash(__name__)
application = app.server
app.config.supress_callback_exceptions = True


app.layout = html.Div(children=[

    html.Div([
            html.Div([

                html.H4(children='Reader'),
                html.Br(),

            ],style={'text-align':'center'}),
            html.Br(),
            html.Br(),
            html.Div([

                dcc.Upload(html.Button('Upload File'),id='upload-data',style = dict(display = 'inline-block')),
                html.Br(),
            ]

            ),  
    html.Div(id='output-data-upload'),          

    ])


        ])


@app.callback(Output('output-data-upload', 'children'),
              [Input('upload-data', 'contents')],
              [State('upload-data', 'filename')])
def update_output(contents, filename):
    if contents is not None:
        content_type, content_string = contents.split(',')
        decoded = base64.b64decode(content_string)
        document = Document(io.BytesIO(decoded))

        combined_df = pd.read_csv('combined_df.csv')

        def calc_tfidf(input1): 
            input1 = input1.reset_index(drop=True)
            input1['samplecol'] = 'sample'
            return input1


        num_cores = mp.cpu_count() - 1   #number of cores on your machine
        num_partitions = mp.cpu_count() - 1 #number of partitions to split dataframe
        df_split = np.array_split(combined_df, num_partitions)
        pool = Pool(num_cores)
        df = pd.concat(pool.map(calc_tfidf, df_split))
        pool.close()
        pool.join()   

        return len(combined_df)

    else:
        return 'No File uploaded'

app.css.append_css({'external_url': 'https://codepen.io/plotly/pen/EQZeaW.css'})

if __name__ == '__main__':

    app.run_server(debug=True)

Приведенное выше тире-приложение принимает в качестве входных данных любой файл.После загрузки файла во внешний интерфейс в файл данных загружается локальный файл CSV (любой файл, в моем случае это combined_df.csv).Теперь я хочу разделить информационный фрейм на части, используя многопроцессорную обработку, обработать его и объединить обратно.Но приведенный выше код приводит к следующей ошибке:

AttributeError: Невозможно выбрать локальный объект 'update_output..calc_tfidf'

Что не так с этим фрагментом кода?

1 Ответ

0 голосов
/ 15 июня 2019

Хорошо, я понял это сейчас! Проблема в том, что функция calc_tfidf не была определена как глобальная функция. Я изменил функцию на глобальную, и она отлично работала.

...