У меня есть многопоточная программа, на которой я работаю:
- Windows 10 PRO x64
- Python 3.8.2 ( x64) (Python 3.8.2 (теги / v3.8.2: 7b3ab59, 25 февраля 2020, 23:03:10) [MS C v.1916 64 бит (AMD64)] на win32)
- также попробуйте Python 3.8.0 с той же ошибкой
- VS Code (x64) 1.43.0
- ms- python расширение для кода VS (ms- python. python -2020.2.64397)
Я получил эту ошибку:
Could not connect to 127.0.0.1: 63323
Could not connect to 127.0.0.1: 63323
Traceback (most recent call last):
Traceback (most recent call last):
File "c:\Users\test\.vscode\extensions\ms-python.python-2020.2.64397\pythonFiles\lib\python\new_ptvsd\no_wheels\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_comm.py", line 514, in start_client
s.connect((host, port))
ConnectionRefusedError: [WinError 10061] No connection could be established because the target computer actively rejected it
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "c:\Users\test\.vscode\extensions\ms-python.python-2020.2.64397\pythonFiles\lib\python\new_ptvsd\no_wheels\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_comm.py", line 514, in start_client
s.connect((host, port))
ConnectionRefusedError: [WinError 10061] No connection could be established because the target computer actively rejected it
Traceback (most recent call last):
File "c:\Users\test\.vscode\extensions\ms-python.python-2020.2.64397\pythonFiles\lib\python\new_ptvsd\no_wheels\ptvsd\_vendored\pydevd\pydevd.py", line 2536, in settrace
File "<string>", line 1, in <module>
File "c:\Users\test\.vscode\extensions\ms-python.python-2020.2.64397\pythonFiles\lib\python\new_ptvsd\no_wheels\ptvsd\_vendored\pydevd\pydevd.py", line 2536, in settrace
Could not connect to 127.0.0.1: 63323
_locked_settrace(
_locked_settrace( File "c:\Users\test\.vscode\extensions\ms-python.python-2020.2.64397\pythonFiles\lib\python\new_ptvsd\no_wheels\ptvsd\_vendored\pydevd\pydevd.py", line 2610, in _locked_settrace
Could not connect to 127.0.0.1: 63323
В этом приложении я использую:
import functions as fnc
from multiprocessing import freeze_support
из файла functions.py:
import sys
import csv
import time
import datetime
import argparse
import itertools as it
from os import system, name
from enum import Enum, unique
from tqdm import tqdm
from math import ceil
from multiprocessing import Pool, cpu_count
import codecs
Программы отлично работают на другом P C с Python 3.8.0, тогда я не понимаю этой ошибки
Эта программа сравнивает только 2 файла и показывает diff, они не используют никакого соединения с другим сервером или целыми rnet
Единственное отличие состоит в том, что я сейчас использую Intel i9-9900 (8c / 16t), а на втором компьютере - i5-7500 только с 4 ядрами
EDIT
Когда я устанавливаю количество ядер равным 8 из 16, программы запускаются без ошибок. Мой процессор имеет 8 физических и 16 логических ядер, и я использую cpu_count () для проверки номера процессора, например:
threads = 8 #cpu_count()
p = Pool(threads)
В чем проблема?
РЕДАКТИРОВАТЬ - 09/03/2020 - КОД ИСТОЧНИКА
main.py
import functions as fnc
from multiprocessing import freeze_support
# Run main program
if __name__ == '__main__':
freeze_support()
fnc.main()
functions.py
import sys
import csv
import time
import datetime
import argparse
import itertools as it
from os import system, name
from enum import Enum, unique
from tqdm import tqdm
from math import ceil
from multiprocessing import Pool, cpu_count
import codecs
# ENUM
@unique
class Type(Enum):
TT = 1
# CLASS
class TextFormat:
PURPLE = '\033[95m'
CYAN = '\033[96m'
DARKCYAN = '\033[36m'
BLUE = '\033[94m'
GREEN = '\033[92m'
YELLOW = '\033[93m'
RED = '\033[91m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
END = '\033[0m'
class CrossReference:
def __init__(self, pn, comp, comp_name, type, diff):
self.pn = pn
self.comp = comp
self.comp_name = comp_name
self.type = type
self.diff = diff
def __str__(self):
return f'{self.pn} {get_red("|")} {self.comp} {get_red("|")} {self.comp_name} {get_red("|")} {self.type} {get_red("|")} {self.diff}\n'
def __repr__(self):
return str(self)
def getFullRow(self):
return self.pn + ';' + self.comp + ';' + self.comp_name + ';' + self.type + ';' + self.diff + '\n'
class CrossDuplication:
def __init__(self, pn, comp, cnt):
self.pn = pn
self.comp = comp
self.cnt = cnt
def __str__(self):
return f'{self.pn};{self.comp};{self.cnt}\n'
def __repr__(self):
return str(self)
def __hash__(self):
return hash(('pn', self.pn,
'competitor', self.comp))
def __eq__(self, other):
return self.pn == other.pn and self.comp == other.comp
# FUNCTIONS
def get_formated_time(mili):
sec = mili / 1000.0
return str(datetime.timedelta(seconds = sec))
def get_green(text): # return red text
return(TextFormat.GREEN + str(text) + TextFormat.END)
def get_red(text): # return red text
return(TextFormat.RED + str(text) + TextFormat.END)
def get_yellow(text): # return yellow text
return(TextFormat.YELLOW + str(text) + TextFormat.END)
def get_blue(text): # return blue text
return(TextFormat.BLUE + str(text) + TextFormat.END)
def get_bold(text): # return bold text format
return(TextFormat.BOLD + str(text) + TextFormat.END)
def print_info(text): # print info text format
print("=== " + str(text) + " ===")
# ### LOADER ### Load Cross Reference file
def CSVCrossLoader(file_url, type):
try:
print(get_yellow("============ LOAD CROSS CSV DATA ==========="))
print_info(get_green(f"Try to load data from {file_url}"))
destination = []
with open(file_url, encoding="utf-8-sig") as csv_file:
csv_reader = csv.reader(csv_file, delimiter=';')
line_count = 0
for row in csv_reader:
if row[0].startswith('*'):
continue
if Type[row[3]] is not type:
continue
cr = CrossReference(row[0], row[1], row[2], row[3], row[4])
destination.append(cr)
line_count += 1
filename = file_url.rsplit('\\', 1)
print(
f'Processed {get_red(line_count)} lines for {get_red(type.name)} from {filename[1]}')
print_info(get_green(f"Data was loaded successfully"))
return destination
except Exception as e:
print(e)
print_info(get_red(f"File {file_url} could not be loaded"))
print_info(get_red("Program End"))
exit(0)
# ### LOADER ### Load Catalog with PN details (load only first row)
def CSVCatalogLoader(file_url):
try:
print(get_yellow("=========== LOAD CATALOG CSV DATA =========="))
print_info(get_green(f"Try to load data from {file_url}"))
destination = []
with open(file_url, encoding="utf-8-sig") as csv_file:
csv_reader = csv.reader(csv_file, delimiter=';')
line_count = 0
for row in csv_reader:
if row[0].startswith('*'):
continue
destination.append(row[0])
line_count += 1
filename = file_url.rsplit('\\', 1)
print(f'Processed {get_red(line_count)} lines from {filename[1]}')
print_info(get_green(f"Data was loaded successfully"))
return destination
except:
print_info(get_red(f"File {file_url} could not be loaded"))
print_info(get_red("Program End"))
exit(0)
def FindDuplications(tasks):
dlist, start, count = tasks
duplicates = []
for r in tqdm(dlist[start:start + count]):
matches = [x for x in dlist if r.pn == x.pn and r.comp == x.comp]
duplicates.append(CrossDuplication(r.pn, r.comp, len(matches)))
return {d for d in duplicates if d.cnt > 1}
def CheckDuplications(cross_list):
threads = cpu_count()
tasks_per_thread = ceil(len(cross_list) / threads)
tasks = [(cross_list, tasks_per_thread * i, tasks_per_thread) for i in range(threads)]
p = Pool(threads)
duplicates = p.map(FindDuplications, tasks)
p.close()
p.join()
duplicates = {item for sublist in duplicates for item in sublist}
return duplicates
def main():
# Main Title of app
print_info(get_yellow("Run app"))
# VARIABLES
catalog_list = []
cross_list = []
# Start calculate program running time
start_time = int(round(time.time() * 1000))
# load URL param from program input arguments
validation_type = Type[sys.argv[1]]
cross_ref_url = sys.argv[2]
catalog_url = sys.argv[3]
# Get info abou tested type
print_info(get_blue(f"||| Validate data for {validation_type.name} |||"))
print("Number of processors: ", cpu_count())
print()
# load data
cross_list = CSVCrossLoader(cross_ref_url, validation_type)
catalog_list = CSVCatalogLoader(catalog_url)
# Chech data in Cross Reference for Duplications [ MULTITHREAD ]
duplicates = CheckDuplications(cross_list)
# Print duration of execution script
mili = int(int(round(time.time() * 1000)) - start_time)
print(f'Script duration - {mili} ms | {get_formated_time(mili)}')
# End of program
print_info(get_yellow(""))
print()
запуск. json - файл конфигурации кода VS
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "First",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"args": [
"TT",
"..\\url\\ref.csv",
"..\\url\\catalog.csv"
]
}
]
}
ФАЙЛ ДАННЫХ - ref.csv (пример)
xxx;123;
ccc;dgd;
xxx;323;
xxx;dgd;
xxx;123;
...etc:.
ФАЙЛ ДАННЫХ - catalog.csv (пример )
xxx;
ccc;
vvv;
fff;
xyx;
xxx;
cff;
ccc;
www;
...etc:.
Приложение загружает 2 CSV-файла и находит дубликаты строк в ref.csv, в этом файле более 100k + строк и сравнивает первый и второй столбцы каждой строки с одинаковыми данными в foreach l oop
Для L oop для списка объектов с использованием многопоточности в Python - Мой предыдущий вопрос, как это сделать многопоточностью
РЕДАКТИРОВАТЬ - 10/03/2020 - Третий компьютер
Сегодня я пробую его на своем ноутбуке (Lenovo T480s) с Intel Core i7-8550U с 4c / 8t
I запустить его с threads = cpu_count()
, эта функция retu 8 ядер / потоков и все работает нормально, с той же конфигурацией, что и на 2 предыдущих компьютерах, но только на Intel Core i9-9900. Код ошибки:
Кроме того, я попытался установить i9-9900:
threads = 8 # OK
threads = 12 # OK
threads = 14 # ERROR
threads = 16 # ERROR
================================================ Выполнить native в CMD или Powershell отлично работает с 16 потоками - OK
C:\Users\test\AppData\Local\Programs\Python\Python38\python.exe 'c:\Users\test\Documents\Work\Sources\APP\src\APP\cross-validator.py' 'TT' 'c:\Users\test\Documents\Work\Sources\APP\src\APP\APP\Definitions\ref.csv' 'c:\Users\test\Documents\Work\Sources\APP\src\APP\APP\Definitions\Tan\catalog.csv'
Запуск через отладку кода VS добавляет еще один параметр со ссылкой на ms- python - ERROR
${env:PTVSD_LAUNCHER_PORT}='49376'; & 'C:\Users\test\AppData\Local\Programs\Python\Python38\python.exe' 'c:\Users\test\.vscode\extensions\ms-python.python-2020.2.64397\pythonFiles\lib\python\new_ptvsd\no_wheels\ptvsd\launcher' 'c:\Users\test\Documents\Work\Sources\APP\src\APP\cross-validator.py' 'TAN' 'c:\Users\test\Documents\Work\Sources\APP\src\APP\APP\Definitions\ref.csv' 'c:\Users\test\Documents\Work\Sources\APP\src\APP\APP\Definitions\Tan\catalog.csv'
Спасибо за помощь