python多进程变量Manager.dict() | 深度赋值无效问题解决

今天在写工具的时候,遇到一个很恶心的问题,多进程一直数据拿不到,并且会有报错:

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'}}
发布了170 篇原创文章 · 获赞 351 · 访问量 72万+

猜你喜欢

转载自blog.csdn.net/wy_97/article/details/104129577