zoukankan      html  css  js  c++  java
  • local对象

    一、local对象

    1.1不使用local

    
    # 不用local
    from threading import Thread
    import time
    cxw = -1
    
    def task(arg):
        global cxw
        cxw = arg
        time.sleep(2)
        print(cxw)
    
    for i in range(10):
        t = Thread(target=task, args=(i,))
        t.start()
    
    

    结果:9 9 9 9 9 9 9 9 9 9

    1.2导入的local

    from threading import Thread
    from threading import local
    import time
    
    # 特殊的对象
    cxw = local()
    def task(arg):
        # 对象.val = 1/2/3/4/5
        cxw.value = arg
    
        time.sleep(2)
    
        print(cxw.value)
    for i in range(10):
        t = Thread(target=task,args=(i,))
        t.start()
    

    结果:0 2 3 4 6 5 8 7 9

    1.3字典形式

    
    
    from threading import get_ident, Thread
    import time
    
    storage = {}
    
    
    def set(k, v):
        '''
    
        所有k都相同,根据线程的id不同来进行设置值
        :param k:
        :param v:
        :return:
        '''
        ident = get_ident()
        if ident in storage:
            storage[ident][k] = v
        else:
            storage[ident] = {k: v}
    
    
    def get(k):
        """
        根据当前的线程id获取值
        :param k:
        :return:
        """
        ident = get_ident()
        return storage[ident][k]
    
    
    def task(arg):
        set('val', arg)
        time.sleep(2)
        v = get('val')
        print(v)
    
    
    for i in range(10):
        t = Thread(target=task, args=(i,))
        t.start()
    
    

    结果:0 1 2 3 6 4 5 9 8 7

    1.4面向对象的方式

    from threading import get_ident, Thread
    import time
    
    
    class Local(object):
        storage = {}
    
        def set(self, k, v):
            ident = get_ident()
            if ident in Local.storage:
                Local.storage[ident][k] = v
            else:
                Local.storage[ident] = {k: v}
    
        def get(self, k):
            ident = get_ident()
            return Local.storage[ident][k]
    
    
    obj = Local()
    
    
    def task(arg):
        obj.set('val', arg)
        v = obj.get('val')
        print(v)
    
    
    for i in range(10):
        t = Thread(target=task, args=(i,))
        t.start()
    

    结果:0 1 2 3 6 4 5 9 8 7

    1.5 每个对象都有自己的storage

    # try...except...根据源码实现
    try:
        from greenlet import getcurrent as get_ident
    except Exception as e:
        from threading import get_ident
    from threading import Thread
    # from threading import get_ident,Thread
    import time
    
    
    class Local(object):
        def __init__(self):
            object.__setattr__(self, 'storage', {}) # 使用父类方式添加,否则__getattr__会出现递归
            # self.storage={}
    
        # storage={}
    
        def __setattr__(self, k, v):
            ident = get_ident()
            if ident in self.storage: # self.storage会到__getattr__中找,在__getattr__中没有没有也要找,自己调用自己,从而就导致了递归,疑惑:在__init__中已经产生创建了,怎们还会产生递归循环
                self.storage[ident][k] = v
            else:
                self.storage[ident] = {k: v}
    
        def __getattr__(self, k):
            ident = get_ident()
            return self.storage[ident][k]
    
    
    obj = Local()
    obj1 = Local()
    
    
    def task(arg):
        obj.val = arg
        obj.xxx = arg
        print(obj.val)
    
    
    for i in range(10):
        t = Thread(target=task, args=(i,))
        t.start()
    
    

    结果:0 1 2 3 6 4 5 9 8 7

  • 相关阅读:
    88、使用tensorboard进行可视化学习,查看具体使用时间,训练轮数,使用内存大小
    88、展示Tensorflow计算图上每个节点的基本信息以及运行时消耗的时间和空间
    关于实时监听输入框的值变化
    再谈javascript函数节流
    HTML5离线缓存Manifest
    javascript判断浏览器支持CSS3属性
    关于移动web开发过程中的”点透“问题
    跨域解决方案之HTML5 postMessage
    最精简的金额格式化
    Grunt usemin前端自动化打包流程
  • 原文地址:https://www.cnblogs.com/randysun/p/15518209.html
Copyright © 2011-2022 走看看