当数组(数据)超过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')
答案 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 ,您将看到旧行为