我是多处理新手,需要它来处理OpenStreet数据。我使用Python 3.5。我知道有一些问题涉及这个话题。但我更喜欢Process类的解决方案。当然,欢迎其他建议。
import overpy
api = overpy.Overpass()
result = api.query("""area[name="Aachen"]->.a;(rel(area.a)["building"];way(area.a)["building"];);(._;>;);out;""")
import multiprocessing as mp
def transfer(i,send_end):
way = result.ways[i]
bldg = {'id':way.id,
'nodeid':[way.nodes[h].id for h in range(len(way.nodes))],
'coords':[(way.nodes[j].lat, way.nodes[j].lon) for j in range(len(way.nodes))],
'tags':way.tags}
send_end.send(bldg)
if __name__=='__main__':
jobs = []
pipe_list = []
for i in range(10000):
recv_end, send_end = mp.Pipe(False)
p = mp.Process(target=transfer,args=(i,send_end))
jobs.append(p)
pipe_list.append(recv_end)
p.start()
for proc in jobs:
proc.join()
result_list = [x.recv() for x in pipe_list]
问题是大约有60,000个对象,因此会启动很多进程。这压倒了我的系统和触发器:
OSError: [Errno 24] Too many open files
有人知道如何在循环结束前解放资源吗?我尝试在循环中使用join(),但后来,我不知道为什么,它不会使用所有核心。