我有一个大型的XML数据文件(>160M)要处理,似乎使用SAX / expat / pulldom解析是正确的方式。 我想要一个线程来筛选节点并将待处理节点推送到队列中,然后其他工作线程从队列中取出下一个可用节点并处理。
我有以下代码(我知道应该加锁 - 以后会添加)
import sys, time
import xml.parsers.expat
import threading
q = []
def start_handler(name, attrs):
q.append(name)
def do_expat():
p = xml.parsers.expat.ParserCreate()
p.StartElementHandler = start_handler
p.buffer_text = True
print("opening {0}".format(sys.argv[1]))
with open(sys.argv[1]) as f:
print("file is open")
p.ParseFile(f)
print("parsing complete")
t = threading.Thread(group=None, target=do_expat)
t.start()
while True:
print(q)
time.sleep(1)
问题在于
while
块的主体仅调用一次,然后我甚至无法使用ctrl-C中断它。在较小的文件上,输出结果符合预期,但这似乎表明处理程序仅在完全解析文档时才被调用,这似乎违背了SAX解析器的目的。
我确定这是我的无知,但我不知道我犯了什么错误。
PS:我还尝试通过更改start_handler
来解决问题:
def start_handler(name, attrs):
def app():
q.append(name)
u = threading.Thread(group=None, target=app)
u.start()
没有爱情,只有技术。