Python多线程/多处理非常慢期货

2024-05-16 15:40:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用多线程和/或多处理来加速我的脚本。实际上,我有一个从CSV读取的10000个子网的列表,我想将其转换成一个IPv4对象,然后存储在一个数组中。你知道吗

我的基本代码如下,大约在300毫秒内执行:

aclsConverted = []
def convertToIP(ip):
    aclsConverted.append(ipaddress.ip_network(ip))

for y in acls:
    convertToIP(y['srcSubnet'])

如果我试着期货线程它的工作,但是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'])

如果我试着期货以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个物理内核。你知道吗

任何关于我可能做错什么的建议,我们都将不胜感激!你知道吗


Tags: 代码inipfordefnetwork数组ipaddress
1条回答
网友
1楼 · 发布于 2024-05-16 15:40:03

如果任务太小,那么管理多处理/多线程的开销通常比并行运行任务的好处更昂贵。你知道吗

您可以尝试以下操作:

只需创建两个进程(而不是线程!!!),一个处理前5000个子网,另一个处理其他5000个子网。你知道吗

在那里,您可能会看到一些性能改进。但是您执行的任务并不是CPU或IO密集型的,因此不确定它是否可以工作。你知道吗

另一方面,Python中的多线程处理对于没有IO和纯Python代码的任务来说,根本没有任何性能改进。你知道吗

原因是臭名昭著的GIL(全局解释器锁)。在python中,不能在同一进程中并行执行两个python字节码。你知道吗

python中的多线程仍然适用于具有IO(执行网络访问)、执行休眠、调用模块、用C实现并且释放GIL的任务。例如,numpy发布了GIL,因此是多线程的一个很好的候选者

相关问题 更多 >