今天在写工具的时候,遇到一个很恶心的问题,多进程一直数据拿不到,并且会有报错:
maximum recursion depth exceeded while calling a Python object
搜了下这个报错的意思是递归超过最大限度,可是我就两个for循环嵌套,最大循环也就1w以内,这也能出问题?
google了一天,总算明白是什么情况了,这里填坑
多进程的变量Manager.dict()
在赋值的时候只能接收一层赋值
# -*- coding: UTF-8 -*-
'''
Desprition:
multiprocessing.Manager().dict()
赋值问题探讨
Author:
Sp4rkW https://sp4rkw.blog.csdn.net/
Modify:2020-02-01 00:45:58
'''
import multiprocessing
if __name__ == '__main__':
mgr = multiprocessing.Manager()
demo1 = mgr.dict()
demo1['a'] = 'bb'
print("第一种情况:",end='')
print(demo1)
demo2 = mgr.dict()
demo2['a'] = {}
demo2['a']['b'] = 'cc'
print("第二种情况:",end='')
print(demo2)
demo3 = mgr.dict()
demo3.update({'a':'b'})
print("第三种情况:",end='')
print(demo3)
demo5 = mgr.dict()
demo5['a'] = {}
demo5['a'].update({'a':{'a':'b'}})
print("第五种情况:",end='')
print(demo5)
运行结果如下:
第一种情况:{'a': 'bb'}
第二种情况:{'a': {}}
第三种情况:{'a': 'b'}
第五种情况:{'a': {}}
很容易得出一个结论,当我们对其子dict
部分进行二次赋值的时候,无效
那是不是mulManager.dict()
仅仅支持一层的dict
?再来做个测试
demo4 = mgr.dict()
demo4.update({'a':{'a':{'a':'b'}}})
print("第四种情况:",end='')
print(demo4)
输出结果如下:
第四种情况:{'a': {'a': {'a': 'b'}}}
可以说明,并不是自身深度限制
那难道我们初始赋值之后,就无法再次赋值了么?答案当然是不对,我们可以进行赋值,但是赋值只能从最外面统一修改,而不能通过索引key值去修改某个值。如果还是没能理解的话,看下面的例子
demo6 = mgr.dict()
demo6.update({'a':{'a':{'a':'b'}},'b':{}})
demo6.update({'b':{'a':'b'},'c':{'a1':'b1'}})
print("第六种情况:",end='')
print(demo6)
输出结果如下:
第六种情况:{'a': {'a': {'a': 'b'}}, 'b': {'a': 'b'}, 'c': {'a1': 'b1'}}