先查看电脑CPU情况
import os
print("提示:本机为",os.cpu_count(),"核CPU")
使用multiprocessing中
使用multiprocessing创建进程池,进程池Pool可以用返回值
import multiprocessing as mp
#from multiprocessing import Pool
pool = mp.Pool(processes = 12)#运行12个进程同时进行,如果是mp.Pool()则默认使用所有进程
注意进程有关代码要放到要放到if __name__ == '__main__':中,否则无法执行成功。
执行速度比单次执行快16倍【我的电脑是16核】,当然,从结果输出中可以看到每16个i值一起输出。
注意,在使用异步执行的时候需要确保函数是可序列化的(是个坑😢),比如以下给出的例子中,是直接将数据表on_off全部传送到函数中,i也传入。个人理解是这样,在多个cpu上分配on_off和需要执行的i,cpu根据这些数据能工作,如此确保异步的执行。
import time
import osmnx as ox
import multiprocessing as mp
import pandas as pd
def find_nearest_edge(on_off,i):
a = []
a.append(i)
print(i)
a.append(ox.nearest_edges(G,on_off['dropoff_longitude'][i],on_off['dropoff_latitude'][i]))
return a
if __name__ == '__main__':
stime = time.time()
G = nx.read_graphml(r'shanghai.graphml')
on_off = pd.read_csv(r'point.csv')
on_off['nearest_edge'] = None
pool = mp.Pool()
res = []
for i in range(len(on_off):
res.append(pool.apply_async(find_nearest_edge,(on_off,i)))#异步执行#off和G
pool.close()
pool.join()
f = open("edge1.txt","w")
for i in res: #不能直接get,循环获得
re = i.get()
print(re)
f.writelines(str(re)+'\n')
f.close()
若有收获,就点个赞吧