问:Python - multiprocessing.Queue()只返回一个设置数据

时间:2014-12-05 08:02:18

标签: python-2.7 queue multiprocessing

我正在研究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'])

有人可以帮忙解决我的错误吗?因为我是这种多处理技术的新手。

2 个答案:

答案 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)

<强> [更新] 我移动列表processesqueue

 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个输出要显示,结果看起来不错。 现在,我将我的问题更新为“可以通过循环打印队列对象吗?”