gpt4 book ai didi

Python 多线程/多处理在 concurrent.futures 中非常慢

转载 作者:行者123 更新时间:2023-12-03 12:44:49 25 4
gpt4 key购买 nike

我正在尝试使用多线程和/或多处理来加快我的脚本速度。本质上,我有一个从 CSV 读取的 10,000 个子网的列表,我想将其转换为 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 个物理内核。

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

最佳答案

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

您可以尝试以下操作:

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

在那里您可能会看到一些性能改进。但是您执行的任务不是 CPU 或 IO 密集型的,所以不确定它是否会起作用。

另一方面,Python 中的多线程将有 完全没有性能提升对于没有 IO 并且是纯 Python 代码的任务。

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

python 中的多线程对于具有 IO(执行网络访问)、执行 sleep 、调用模块、在 C 中实现并且确实释放 GIL 的任务仍然有意义。例如,numpy 发布了 GIL,因此是多线程的良好候选者

关于Python 多线程/多处理在 concurrent.futures 中非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58728491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com