我正在研究django。我的项目试图将一个文档与其他文档进行比较 这个我的数据示例:
原始文件:
doc_original.txt
测试文件:
doc1.txt
doc2.txt
doc3.txt
我将doc_original.txt
的内容保存在名为txt
的变量上。然后,要访问doc1.txt, doc2.txt, doc3.txt
上的内容,请使用以下代码:
for i in testdocument:
for pat in i.chunks():
pat = prep_text(pat)
multiprocessing.Queue()从本节开始:
for testfilename in testdocument:
for pat in testfilename.chunks():
pat = prep_text(pat)
processes = []
queue = Queue()
processes.append(Process(
target=sim,
args=(txt, pat, txtfilename, testfilename, queue,)))
for pr in processes:
pr.start()
for pr in processes:
pr.join()
print (queue.get())
这是sim
方法实现
def sim(txt, pat, txtname, patname, q):
txtlen = len(txt)
intersect = 0
similarity = 0
intersect = full_search(txt, pat)
similarity = 1 - ((txtlen - intersect) / txtlen)
q.put({"sim(%s, %s) = %f" %(txtname, patname, similarity)})
我希望输出应该是这样的:
sim(doc_original.txt, doc1.txt) = percentage
sim(doc_original.txt, doc2.txt) = percentage
sim(doc_original.txt, doc3.txt) = percentage
但它只会返回:
set(['sim(doc_original.txt, doc3.txt) = percentage'])
有人可以帮忙解决我的错误吗?因为我是这种多处理技术的新手。
答案 0 :(得分:2)
您在for循环的每次迭代中多次声明queue
次。尝试将队列声明移到循环外部。
queue = Queue()
for testfilename in testdocument:
for pat in testfilename.chunks():
pat = prep_text(pat)
processes = []
#queue = Queue()
processes.append(Process(
target=sim,
args=(txt, pat, txtfilename, testfilename, queue,)))
要遍历queue
,您需要遍历队列,直到它为空。
while not queue.empty():
print (queue.get())
答案 1 :(得分:0)
<强> [更新] 强>
我移动列表processes
和queue
processes = []
queue = Queue()
for testfilename in testdocument:
for pat in testfilename.chunks():
pat = prep_text(pat)
processes.append(Process(
target=sim,
args=(txt, pat, txtfilename, testfilename, queue,)))
for pr in processes:
pr.start()
for pr in processes:
pr.join()
然后,我尝试打印这样的结果
print (queue.get())
print (queue.get())
print (queue.get())
我写了三次因为我有3个输出要显示,结果看起来不错。 现在,我将我的问题更新为“可以通过循环打印队列对象吗?”