処理する大きな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
ブロックの本体が1回だけ呼び出され、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()
しかし、愛はありません。