0
I have a problem that I have deployed with NGINX and UWSGI on a debian 9 with 24 cores, the application is simply running correctly, but when I upload an excel file the application is using only one server core and with it reaching 100%, with this the application takes time to process the file giving the times time out.
py views.
def create(self, request, *args, **kwargs):
    phone_numbers = []
    count_error = 0
    phone_invalid = 0
    count_repeat = 0
    count_success = 0
    nodes_success = []
    nodes_error = []
    black_list_logs_saved = []
    black_list_saved = []
    vicidial_dnc_logs = []
    phones_unique_saved = []
    logs_saved = []
    try:
        date_init = datetime.datetime.today()
        file = request.data['file']
        SaveFileExcel.objects.create(
            user=request.data['user'],
            action=request.data['action'],
            file_path=file
        )
        try:
            read_file = pd.read_excel(file)
        except Exception as e:
            _queryset = SaveFileExcel.objects.filter(action__icontains='add')
            _serializer = SaveFileExcelSerializer(_queryset, many=True)
            read_file = pd.read_csv(os.path.join(BASE_DIR, _serializer.data[-1]['file_path']))
        phones_in_file, phones_invalid, amount_phones = utils.treating_numbers_in_file(read_file,
                                                                                       BlackListSerializer(
                                                                                           BlackList.objects.all(),
                                                                                           many=True))
        phones_uniques, phones_repeat = utils.treating_numbers_replay(phones_in_file)
        for phone in phones_invalid:
            vicidial_dnc_logs.append({'phone_number': phone, 'campaign_id': '-SYSINT-',
                                       'action': 'add', 'action_date': str(datetime.datetime.today()),
                                       'user': request.data['user']})
            black_list_logs_saved.append({'phone_number': phone, 'user': request.data['user'], 'action': 'Invalid'})
            logs_saved.append({'action': 'invalid', 'user': request.data['user'], 'status': 'Alert',
                               'message': 'Phone number {0} invalido'.format(phone), 'method': 'blacklistlogs'})
            with open(_file, 'a') as arq:
                arq.write('\n[{0}] - Phone number {1} invalido.'.format(
                    datetime.datetime.today(), phone))
        for phone in phones_uniques:
            phones_unique_saved.append({'phone_number': phone})
            vicidial_dnc_logs.append({'phone_number': phone, 'campaign_id': '-SYSINT-',
                                      'action': request.data['action'], 'action_date': str(datetime.datetime.today()),
                                      'user': request.data['user']})
            black_list_logs_saved.append({'phone_number': phone, 'user': str(request.data['user']), 'action': request.data['action']})
            logs_saved.append({'action': 'Add', 'user': request.data['user'], 'status': 'Success',
                               'message': 'Phone number {0} adicionado'.format(phone), 'method': 'blacklistlogs'})
            with open(_file, 'a') as arq:
                arq.write('\n[{0}] - Phone number {1} inserido.'.format(
                    datetime.datetime.today(), phone))
        with open(_file, 'a') as arq:
            arq.write('\n[{0}] - Foi encontrado {1} números repetidos na lista inserida'.format(
                datetime.datetime.today(), phones_repeat))
        logs_saved.append({'action': 'insert', 'user': str(request.data['user']), 'status': 'Success',
                           'message': 'Foi inserido {0} números no banco.'.format(phones_uniques.__len__()), 'method': 'blacklistlogs'})
        with open(_file, 'a') as arq:
            arq.write('\n[{0}] - Foi inserido {1} números no banco.'.format(
                datetime.datetime.today(), phones_uniques.__len__()))
        date_end = datetime.datetime.today() - date_init
        with open(_file, 'a') as arq:
            arq.write('[{0}] - Processamento de dados em {1} tempo.'.format(datetime.datetime.today(),
                                                                                      date_end))
        print('processando dados em : {0}'.format(date_end))
    except Exception as ex:
        request_data = []
        try:
            if '.txt' in str(file.name):
                SaveFileExcel.objects.create(
                    user=request.data['user'],
                    action=request.data['action'],
                    file_path=file
                )
                _queryset = SaveFileExcel.objects.all()
                _serializer = SaveFileExcelSerializer(_queryset, many=True)
                file_path = os.path.join(BASE_DIR, _serializer.data[-1]['file_path'])
                with open(file_path, 'r') as arq:
                    list_data = arq.read().split('\n')
                    request_data = list_data[1:]
                request_data = utils.treating_txt_request(request_data, str(request.data['user']), str(request.data['action']))
        except UnboundLocalError as unex:
            request_data = request.data
        if type(request_data) is list and request_data.__len__() > 0:
            user = request_data[0]['user']
            for black in request_data:
                if {'phone_number': str(black['phone_number'])} not in phone_numbers \
                        and BlackList.objects.filter(phone_number=black['phone_number']).exists() is False:
                    phone_numbers.append({'phone_number': str(black['phone_number'])})
                else:
                    count_repeat += 1
                if nodes_server['nodes'].__len__() > 0:
                    for node in nodes_server['nodes']:
                        if node == 'teste':
                            try:
                                vicidial_dnc_logs.append({'phone_number': black['phone_number'], 'campaign_id': '-SYSINT-',
                                                          'action': black['action'], 'action_date': datetime.datetime.utcnow(),
                                                          'user': user})
                                if node not in nodes_success:
                                    nodes_success.append(node)
                                with open(_file, 'a') as arq:
                                    arq.write('[{0}] - Success - Phone number {1} gravado no node {2}\n'.format(
                                        datetime.datetime.today(), black['phone_number'], node))
                            except Exception as e:
                                if node not in nodes_error:
                                    nodes_error.append(node)
                                count_error += 1
                                with open(_file, 'a') as arq:
                                    arq.write('[{0}] - Error - Phone number {1} não foi gravado no node {2} - Error: {3}\n'.format(
                                        datetime.datetime.today(), black['phone_number'], node, e))
                if 9 < str(black['phone_number']).__len__() < 12:
                    black_list_saved.append({'phone_number': black['phone_number']})
                    black_list_logs_saved.append(black)
                    with open(_file, 'a') as arq:
                        arq.write('[{0}] - Phone number: {1} inserido\n'.format(
                            datetime.datetime.today(), black['phone_number']))
                else:
                    with open(_file, 'a') as arq:
                        arq.write('[{0}] - Numero {1} incorreto.\n'.format(datetime.datetime.today(), black['phone_number']))
                    utils.save_logs_blacklist('insert', user, 'Invalid',
                                              'Numero {0} invalido, nao foi inserido.'.format(black['phone_number']),
                                              black['phone_number'])
                    phone_invalid += 1
            if nodes_server['nodes_error'].__len__() > 0:
                for node in nodes_server['nodes_error']:
                    logs_saved.append({'method': 'blacklistlogs', 'action': 'insert', 'user': user, 'status': 'Error',
                                       'message': 'Não foi possível inserir dados no node: {0}.'.format(node)})
                    count_error += 1
                    with open(_file, 'a') as arq:
                        arq.write('\n[{0}] - Error -  Não foi possível inserir dados no node: {1}'.format(
                            datetime.datetime.today(), node))
            for _n in nodes_success:
                logs_saved.append({'method': 'blacklistlogs', 'action': 'insert', 'user': user, 'status': 'Success',
                                   'message': 'Dados inseridos com sucesso no node: {0}.'.format(_n)})
                with open(_file, 'a') as arq:
                    arq.write('[{0}] - Success - Dados inseridos com sucesso no node: {1}.\n'.format(
                        datetime.datetime.today(), _n))
            for _n in nodes_error:
                logs_saved.append({'method': 'blacklistlogs', 'action': 'insert', 'user': user, 'status': 'Error',
                                   'message': 'Não foi possível inserir dados no node: {0}.'.format(_n)})
                with open(_file, 'a') as arq:
                    arq.write('[{0}] - Error - Não foi possível inserir dados no node: {1}\n'.format(
                        datetime.datetime.today(), _n))
    for num in phone_numbers:
        count_success += 1
        with open(_file, 'a') as arq:
            arq.write('[{0}] - Success - Phone number {1} gravado na tabela VicidialDnc no node {2}\n'.format(
                datetime.datetime.today(), num, node))
    # Saving only unique numbers in BlackList and VicidialDnc
    if phone_numbers.__len__() > 0:
        date_init = datetime.datetime.today()
        try:
            self.serializer_class = BlackListSerializer
            _serializer = self.get_serializer(data=phone_numbers, many=True)
            _serializer.is_valid(raise_exception=True)
            self.perform_bulk_create(_serializer)
        except Exception as e:
            with open(_file, 'a') as arq:
                arq.write('\n[{0}] - {1}'.format(datetime.datetime.today(), e))
        try:
            self.serializer_class = VicidialDncSerializer
            _serializer = self.get_serializer(data=phone_numbers, many=True)
            executor.submit(_serializer.is_valid(raise_exception=True))
            executor.submit(self.perform_bulk_create(_serializer))
        except Exception as e:
            if e.args[0].__len__() > 0 and count_success > 0:
                count_repeat += e.args[0].__len__()
                count_success = count_success - count_repeat
            logs_saved.append({'action': 'insert', 'user': str(request_data[0]['user']), 'status': 'Alert',
                               'message': 'Foi identificado {0} numeros repetidos'.format(count_repeat), 'method': 'blacklistlogs'})
            with open(_file, 'a') as arq:
                arq.write('[{0}] - {1}\n'.format(
                    datetime.datetime.today(), e
                ))
        date_end = datetime.datetime.today() - date_init
        with open(_file, 'a') as arq:
            arq.write('[{0}] - Salvo o Vicidial DNC e BlackList em {1} tempo.'.format(datetime.datetime.today(),
                                                                                      date_end))
    if phones_repeat == 0 and phone_numbers.__len__() == 0 and amount_phones < phones_in_file.__len__():
        phones_repeat += amount_phones
        logs_saved.append({'action': 'insert', 'user': str(request.data['user']), 'status': 'Alert',
                           'message': 'Foi identificado {0} numeros repetidos'.format(phones_repeat),
                           'method': 'blacklistlogs'})
        with open(_file, 'a') as arq:
            arq.write('[{0}] - Foi identificado {1} numeros repetidos'.format(datetime.datetime.today(), count_repeat))
    if amount_phones > phones_in_file.__len__():
        phones_repeat += amount_phones - phones_in_file.__len__()
        logs_saved.append({'action': 'insert', 'user': str(request.data['user']), 'status': 'Alert',
                           'message': 'Foi identificado {0} numeros repetidos'.format(phones_repeat),
                           'method': 'blacklistlogs'})
        with open(_file, 'a') as arq:
            arq.write(
                '[{0}] - Foi identificado {1} numeros repetidos'.format(datetime.datetime.today(), count_repeat))
    if phone_numbers.__len__() == 0 and count_success == 0 and count_repeat == 0:
        if phones_uniques.__len__() > 0:
            date_init = datetime.datetime.today()
            try:
                self.serializer_class = BlackListSerializer
                _serializer = self.get_serializer(data=phones_unique_saved, many=True)
                _serializer.is_valid(raise_exception=True)
                self.perform_bulk_create(_serializer)
            except Exception as e:
                with open(_file, 'a') as arq:
                    arq.write('\n[{0}] - {1}'.format(datetime.datetime.today(), e))
            try:
                self.serializer_class = VicidialDncSerializer
                _serializer = self.get_serializer(data=phones_unique_saved, many=True)
                executor.submit(_serializer.is_valid(raise_exception=True))
                executor.submit(self.perform_bulk_create(_serializer))
            except Exception as e:
                if e.args[0].__len__() > 0:
                    phones_repeat += e.args[0].__len__()
                logs_saved.append({'action': 'insert', 'user': request.data['user'], 'status': 'Alert',
                                   'message': 'Foi identificado {0} numeros repetidos'.format(phones_repeat), 'method': 'blacklistlogs'})
                with open(_file, 'a') as arq:
                    arq.write('[{0}] - {1}\n'.format(
                        datetime.datetime.today(), e
                    ))
            date_end = datetime.datetime.today() - date_init
            with open(_file, 'a') as arq:
                arq.write('[{0}] - Salvo o Vicidial DNC e BlackList em {1} tempo.'.format(datetime.datetime.today(), date_end))
            print('vicidial_dnc and blacklist {0}'.format(date_end))
    if vicidial_dnc_logs.__len__() > 0:
        date_init = datetime.datetime.today()
        try:
            self.serializer_class = VicidialDncLogSerializer
            _serializer = self.get_serializer(data=vicidial_dnc_logs, many=True)
            executor.submit(_serializer.is_valid(raise_exception=True))
            executor.submit(self.perform_bulk_create(_serializer))
        except Exception as e:
            with open(_file, 'a') as arq:
                arq.write('[{0}] - Error - Não foi possivel inserir dados na vicidial dnc log - {1}\n'.format(
                    datetime.datetime.today(), e
                ))
        date_end = datetime.datetime.today() - date_init
        with open(_file, 'a') as arq:
            arq.write('[{0}] - Salvo o Vicidial DNC Logs em {1} tempo.'.format(datetime.datetime.today(),
                                                                                      date_end))
        print('vicidial_dnc_logs {0}'.format(date_end))
    if logs_saved.__len__() > 0 and isinstance(logs_saved, list):
        date_init = datetime.datetime.today()
        try:
            self.serializer_class = LogSerializer
            _serializer = self.get_serializer(data=logs_saved, many=True)
            _serializer.is_valid(raise_exception=True)
            self.perform_bulk_create(_serializer)
        except Exception as e:
            with open(_file, 'a') as arq:
                arq.write('[{0}] - Error - Não foi possivel inserir o log - {1}\n'.format(
                    datetime.datetime.today(), e
                ))
        date_end = datetime.datetime.today() - date_init
        with open(_file, 'a') as arq:
            arq.write('[{0}] - Salvo o Logs em {1} tempo.'.format(datetime.datetime.today(),
                                                                                      date_end))
        print('logs {0}'.format(date_end))
    if black_list_logs_saved.__len__() > 0:
        date_init = datetime.datetime.today()
        try:
            self.serializer_class = BlackListLogsSerializer
            _serializer = self.get_serializer(data=black_list_logs_saved, many=True)
            _serializer.is_valid(raise_exception=True)
            self.perform_bulk_create(_serializer)
        except Exception as e:
            with open(_file, 'a') as arq:
                arq.write('[{0}] - Error - Não foi possivel inserir dados na black list log - {1}\n'.format(
                    datetime.datetime.today(), e
                ))
        date_end = datetime.datetime.today() - date_init
        with open(_file, 'a') as arq:
            arq.write('[{0}] - Salvo o BlackList Logs em {1} tempo.'.format(datetime.datetime.today(),
                                                                                      date_end))
        print('black_list_logs {0}'.format(date_end))
    try:
        with open(_file, 'a') as arq:
            arq.write('\n[{0}] - Erros: {1} Alert: {2} Success: {3} Invalid: {4}'.format(
                datetime.datetime.today(), count_error, phones_repeat,
                phones_uniques.__len__(), phones_invalid.__len__()))
        return Response({'Erros': count_error,
                         'Alert': phones_repeat,
                         'Success': phones_uniques.__len__(),
                         'Invalid': phones_invalid.__len__()}, status=status.HTTP_201_CREATED)
    except Exception as ex:
        with open(_file, 'a') as arq:
            arq.write('\n[{0}] - Erros: {1} Alert: {2} Success: {3} Invalid: {4}'.format(
                datetime.datetime.today(), count_error, count_repeat,
                count_success, phone_invalid))
        return Response({'Erros': count_error,
                         'Alert': count_repeat,
                         'Success': count_success,
                         'Invalid': phone_invalid}, status=status.HTTP_201_CREATED)
utils.py
@classmethod
def verification_phone_number_exist(cls, model, serializer, phone_number):
    phones = model.objects.filter(phone_number=phone_number)
    if phones.exists():
        return True
    return False
@classmethod
def treating_numbers_in_file(cls, file_excel, _serializer):
    phones = []
    for rows in file_excel.iterrows():
        phones.append(str(rows[1].values[0]))
    phones_end = [phone for phone in phones if 9 < phone.__len__() < 12]
    _phones_end = [phone for phone in phones_end if OrderedDict([('phone_number', str(phone))]) not in _serializer.data]
    phones_invalid = [phone for phone in phones if 9 >= phone.__len__() >= 12]
    return _phones_end, phones_invalid, phones_end.__len__()
Django.ini (uwsgi.ini)
[uwsgi]
# master
master                  = true
# maximum number of processes
processes               = 24
# the socket (use the full path to be safe)
http          = 127.0.0.1:8001
# with appropriate permissions - *may* be needed
chmod-socket    = 664
# the base directory
chdir           = /var/www/html/backend
# Django's wsgi file
module          = api.wsgi:application
master=True
# the virtualenv
home            = /var/www/html/.local/share/virtualenvs/backend-pcI0BIcF
# clear environment on exit
vacuum          = true
env = DJANGO_SETTINGS_MODULE=api.settings