带有并发功能的Python多线程/多处理非常慢

我正在尝试使用多线程和/或多处理来加快我的脚本的速度。本质上,我有一个从CSV读取的10,000个子网的列表,我希望将其转换为IPv4对象,然后存储在数组中。

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

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

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

如果我尝试使用parallel.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'])

然后,如果我尝试使用current.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个物理核心。

任何有关我可能做错事情的建议将不胜感激!

XY064221 回答:带有并发功能的Python多线程/多处理非常慢

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

您可以尝试以下操作:

只需创建两个进程(非线程!),一个进程处理前5000个子网,另一个处理其他5000个子网。

您可能会看到一些性能改进。但是您执行的任务不是CPU或IO密集型,因此不确定它是否可以正常工作。

另一方面,对于没有IO和纯Python代码的任务,

在Python中使用多线程将根本不会提高性能。

原因是臭名昭著的GIL(全局解释器锁)。在python中,您永远无法在同一进程中并行执行两个python字节代码。

Python中的多线程处理对于具有IO(执行网络访问),执行睡眠,调用模块,用C实现并释放GIL的任务仍然有意义。例如numpy会释放GIL,因此是多线程的理想选择

本文链接:https://www.f2er.com/3152900.html

大家都在问