我有一个大的 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()
然而,没有爱。