Python ElementTree并行节点创建

Python ElementTree并行节点创建,python,lxml,python-multiprocessing,Python,Lxml,Python Multiprocessing,我正在将图形对象写入xml表示。我的单片代码工作得很好,但在我的大型图形上太慢了。我正在尝试将其并行化,但无法从池中获取子元素。我确信我遗漏了一些明显的东西,但我对python还是新手 import networkx as nx import lxml.etree as et from multiprocessing import Pool G = nx.petersen_graph() # For any graph, make a node subelement with the id

我正在将图形对象写入xml表示。我的单片代码工作得很好,但在我的大型图形上太慢了。我正在尝试将其并行化,但无法从池中获取
子元素。我确信我遗漏了一些明显的东西,但我对python还是新手

import networkx as nx
import lxml.etree as et
from multiprocessing import Pool

G = nx.petersen_graph()

# For any graph, make a node subelement with the id being the node label
def getNodeAttributes(index):
    et.SubElement(nodes, "node", attrib={'id': str(G.nodes()[index])})

# Do it with one monolithic process
network = et.Element("network", attrib={"name": "Petersen Graph"})
nodes = et.SubElement(network, "nodes")

for i in range(len(G)):
    getNodeAttributes(i)

et.dump(network)

使用队列(
多处理.queue
)收集工作进程的结果。请参阅此问题的答案:


也就是说,我不确定它对您的情况会有多大帮助,因为XML文件需要按顺序读取和解析,而且元素树将非常大。但是试一试…

您没有对
pool.map
的返回值做任何操作,因此…?
子元素
应该创建一个指向
节点的指针。没有任何回报,至少我能找到。哦,我明白了。您应该了解,
多处理
涉及到分叉新的流程来完成工作,即每个流程都会得到要处理的所有内容的副本。如果你不以某种方式将它们返回到主线程,它们所做的任何工作都会丢失。是的,这就是我想弄明白的。有趣。在我的应用程序中,XML解析的顺序实际上并不重要。我明白了,但您仍然需要解析文件。但别听我说,试试看。他似乎不是在解析XML文件,而是在生成一个。哎呀,我错过了!谢谢你,罗斯。
<network name="Petersen Graph">
  <nodes>
    <node id="0"/>
    <node id="1"/>
    <node id="2"/>
    <node id="3"/>
    <node id="4"/>
    <node id="5"/>
    <node id="6"/>
    <node id="7"/>
    <node id="8"/>
    <node id="9"/>
  </nodes>
</network>
# Do it again, but with pool.map in parallel
network = et.Element("network", attrib={"name": "Petersen Graph"})
nodes = et.SubElement(network, "nodes")

pool = Pool(4)
pool.map(getNodeAttributes, range(len(G)))
pool.close()
pool.join()

et.dump(network)
<network name="Petersen Graph">
  <nodes/>
</network>