python中多进程的数据处理
多进程 (Multi-Process) 和多线程 (Multi-Thread) 最大的区别是,多进程是在各自单独的进程内存管理下运行代码,而多线程是共享一个进程内存。在各自单独的进程管理下,多进程的明显优势是可以最大的利用计算机多核心的处理能力。但是多进程也有其劣势,比如说在进程之间通信需要 IPC (Inter Process Communication) 工具,而不像多线程那样可以共享内存数据。
鉴于点云的批处理,开始研究python中的并行处理
1、整体思路先把整个的点云数据分块处理(可以根据自己电脑CPU的内核的数量分块,在Intel i7或者以上的版本的芯片,可以得到一个乘以2的数字,主要是得益于超线程(Hper-Threading)结构)
2、速度明显的加快,(以自己为例,采用单核计算,耗时在 7个小时以上的程序,采用多核(12个核)计算耗时为752.12秒)
示例代码
import math
import datetime
import multiprocessing as mp
def train_on_parameter(name, param):
result = 0
for num in param:
result += math.sqrt(num * math.tanh(num) / math.log2(num) / math.log10(num))
return {name: result}
if __name__ == '__main__':
start_t = datetime.datetime.now()
num_cores = int(mp.cpu_count())
print("本地计算机有: " + str(num_cores) + " 核心")
pool = mp.Pool(num_cores)
param_dict = {'task1': list(range(10, 30000000)),
'task2': list(range(30000000, 60000000)),
'task3': list(range(60000000, 90000000)),
'task4': list(range(90000000, 120000000)),
'task5': list(range(120000000, 150000000)),
'task6': list(range(150000000, 180000000)),
'task7': list(range(180000000, 210000000)),
'task8': list(range(210000000, 240000000))}
results = [pool.apply_async(train_on_parameter, args=(name, param)) for name, param in param_dict.items()]
results = [p.get() for p in results]
end_t = datetime.datetime.now()
elapsed_sec = (end_t - start_t).total_seconds()
print("多进程计算 共消耗: " + "{:.2f}".format(elapsed_sec) + " 秒")
3、如何想要循环这个多核计算的过程,需要在每次循环结束后关闭进程
pool.close()
4、程序运行时,可以在任务管理器中看到CPU的状态以及进程