我正在尝试使用多线程和/或多处理来加速我的脚本。实际上,我有一个从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个物理内核。你知道吗
任何关于我可能做错什么的建议,我们都将不胜感激!你知道吗
如果任务太小,那么管理多处理/多线程的开销通常比并行运行任务的好处更昂贵。你知道吗
您可以尝试以下操作:
只需创建两个进程(而不是线程!!!),一个处理前5000个子网,另一个处理其他5000个子网。你知道吗
在那里,您可能会看到一些性能改进。但是您执行的任务并不是CPU或IO密集型的,因此不确定它是否可以工作。你知道吗
另一方面,Python中的多线程处理对于没有IO和纯Python代码的任务来说,根本没有任何性能改进。你知道吗
原因是臭名昭著的GIL(全局解释器锁)。在python中,不能在同一进程中并行执行两个python字节码。你知道吗
python中的多线程仍然适用于具有IO(执行网络访问)、执行休眠、调用模块、用C实现并且释放GIL的任务。例如,numpy发布了GIL,因此是多线程的一个很好的候选者
相关问题 更多 >
编程相关推荐