当我使用Queue时,进程不会终止

时间:2016-07-03 16:38:14

标签: python-3.x queue multiprocessing

当数组(数据)超过10,000时,并非所有进程都已完成 (见最后一行打印('竞争'))。 当阵列最多2,000个元素时,此代码可以正常工作。 我认为队列有问题, 没有result_queue.put([i,j])所有进程都已正确完成。 任何人都可以帮我解决这部分代码吗?

    def finder(start,end,proc,result_queue,lock):
    global data
    i=start
    while i<=end:
        el=data[i]
        j=-1
        for el1 in data:
            j=j+1
            s1 = SequenceMatcher(None, el, el1)
            s1_val=s1.ratio()
            if s1_val>0.9: result_queue.put([i,j])
        i=i+1
    print('end')


if __name__ == '__main__':
    multiprocessing.freeze_support()
    result_queue = multiprocessing.Queue()
    allProcesses = []
    data=r.keys()
    print(len(data))
    parts=8
    part=int(len(data)/parts)
    i=0
    lock = multiprocessing.Lock()

    while i<parts:
            p = multiprocessing.Process(target=finder, args=(part*i, part*i+part,i,result_queue,lock ))
            print('init',part*i, part*i+part,i)
            allProcesses.append(p)
            p.daemon = True
            p.start()
            i=i+1
            print('started process',i)
    i=0

    for p in allProcesses:
        p.join()
        print('complete')

1 个答案:

答案 0 :(得分:0)

简答:使用multiprocessing.Manager创建队列

class Category extends \yii\db\ActiveRecord
{
    use \common\traits\Signature;
    // Model code here
}

更详细的答案:  multiprocessing.Manager将返回

    m = multiprocessing.Manager()
    result_queue = m.Queue()

可以在工人之间安全共享的实例。

这是一个完整的可运行示例

<class 'multiprocessing.managers.AutoProxy[Queue]'>

如果您将 m.Queue 更改为 multiprocessing.Queue ,您将看到旧行为