Я пытаюсь использовать многопоточность и / или многопроцессорность, чтобы немного ускорить мой сценарий. По сути, у меня есть список из 10000 подсетей, которые я прочитал из CSV, которые я хочу преобразовать в объект IPv4, а затем сохранить в массиве.
Мой базовый код выглядит следующим образом и выполняется примерно за 300 мс:
aclsConverted = []
def convertToIP(ip):
aclsConverted.append(ipaddress.ip_network(ip))
for y in acls:
convertToIP(y['srcSubnet'])
Если я пытаюсь использовать потоки с concurrent.futures, он работает, но в 3-4 раза медленнее, как показано ниже:
aclsConverted = []
def convertToIP(ip):
aclsConverted.append(ipaddress.ip_network(ip))
with concurrent.futures.ThreadPoolExecutor(max_workers=20) as executor:
for y in acls:
executor.submit(convertToIP,y['srcSubnet'])
Тогда, если я попробую с concurrent.futures, обработайте его в 10-15 раз медленнее, и массив будет пустым. Код выглядит следующим образом:
aclsConverted = []
def convertToIP(ip):
aclsConverted.append(ipaddress.ip_network(ip))
with concurrent.futures.ProcessPoolExecutor(max_workers=20) as executor:
for y in acls:
executor.submit(convertToIP,y['srcSubnet'])
Сервер, на котором я работаю, имеет 28 физических ядер.
Любые предложения о том, что я могу сделать неправильно, будут с благодарностью приняты!