Многопоточность Python - Как предотвратить попадание ни одного элемента в результате - Concurrent Futures - PullRequest
0 голосов
/ 31 августа 2018

Я ищу, чтобы очистить данные SSL из списка имен хостов. Все работает, как и ожидалось, за исключением того, что функция get_cert_data возвращает None из-за отсутствия сертификата SSL или невозможности подключения к хосту. Значение None добавляется в certs_list в любом случае. Я использую большой список из 1 миллиона хостов, и я ожидаю, что большинство из них не будет иметь SSL-сертификата из-за характера данных. Понятно, что я хотел бы сохранить память, а не хранить 900K Нет значений в списке. Спасибо, что нашли время, чтобы прочитать это далеко! Бонус: имеет ли смысл использовать доменное имя или имя хоста для получения этих данных и почему?

import concurrent.futures
import pandas as pd

df = pd.read_csv('hostnames.csv')
hosts_list = df['Host name'].tolist()

def get_cert_data(hostname):
    try:
        ctx = ssl.create_default_context()
        s = ctx.wrap_socket(socket.socket(), server_hostname=hostname)
        s.connect((hostname, 443))
        cert = s.getpeercert()
        issuer = dict(x[0] for x in cert['issuer'])
        issued_by = issuer['organizationName']
        if not "COMODO" in issued_by.upper():
            pass
        else:
            print(issued_by)
            return cert
    except Exception as e:
        pass

with concurrent.futures.ThreadPoolExecutor(max_workers = 16) as pool:
    certs_list = list(pool.map(get_cert_data, hosts_list))

1 Ответ

0 голосов
/ 31 августа 2018

pool.map не возвращает результаты. Возвращает итерацию из Future объектов. Каждый представляет операцию, которая будет выполнена. Итак, вам нужно отфильтровать их результаты.

valid_certs = [cert.result() for cert in certs if cert.result() is not None]
...