Python多线程-如何防止无项目以结果结束-并发未来

Python多线程-如何防止无项目以结果结束-并发未来,python,multithreading,concurrency,threadpool,Python,Multithreading,Concurrency,Threadpool,我希望从主机名列表中提取SSL数据。除了由于缺少SSL证书或无法连接到主机而导致get_cert_data函数返回None(无)时,所有操作都正常工作。无论哪种方式,None值都会附加到certs_列表中。我使用的是一个100万主机的大列表,由于数据的性质,我希望其中大多数主机没有SSL证书。可以理解,我希望节省内存,而不是在列表中存储900K None值。感谢您抽出时间阅读本文!奖励:使用域名或主机名获取这些数据更有意义吗?为什么 import concurrent.futures impor

我希望从主机名列表中提取SSL数据。除了由于缺少SSL证书或无法连接到主机而导致get_cert_data函数返回None(无)时,所有操作都正常工作。无论哪种方式,None值都会附加到certs_列表中。我使用的是一个100万主机的大列表,由于数据的性质,我希望其中大多数主机没有SSL证书。可以理解,我希望节省内存,而不是在列表中存储900K None值。感谢您抽出时间阅读本文!奖励:使用域名或主机名获取这些数据更有意义吗?为什么

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))
pool.map不会返回结果。它返回未来对象的iterable。每一个都表示要执行的操作。所以,你必须过滤他们的结果

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

这里有一个小的拼写错误,应该是valid_certs=[cert.result for cert in certs if cert.result不是None]谢谢@blue_note。“cert”是否引用get\u cert\u数据的返回值?这不是100%清楚的me@thecert在完成get_cert_数据的返回值时引用future。参见class concurrent.futures.future抱歉,我弄糊涂的是cert中的cert。什么是证书引用?@ezeekiel:对不起,我的意思显然是证书列表变量