• 线程的唯一标记


    threading.local
      作用:为每个线程开辟一块空间进行数据存储
    自定义Local对象:
      作用:为每个线程(协程)开辟一块空间进行数据存储

    线程的唯一标记get_ident

    from threading import Thread
    from threading import get_ident
    
    
    def task(arg):
        print(get_ident())    #打印出来的是每一个线程的线程号
    
    
    for i in range(10):
        t=Thread(target=task,args=(i,))
        t.start()

     基于函数自定义Local对象

    from threading import  Thread
    from threading import get_ident
    import time
    storage = {}
    
    
    #往storage中放数据
    def set(k,v):
        ident = get_ident()
        if ident in storage:
            storage[ident][k]=v
        else:
            storage[ident]={k:v}
    
    
    #从storage中取数据
    def get(k):
        ident = get_ident()
        return storage[ident][k]
    
    def task(arg):
        set('val',arg)
        time.sleep(2)
        s = get('val')
        print(s)
    
    
    
    for  i in range(10):
        t = Thread(target=task,args=(i,))
        t.start()
    View Code

    基于面向对象实现的自定义Local对象

    from threading import  Thread
    from threading import get_ident
    import time
    
    
    class Local:
        storage = {}
        #往storage中放数据
        def set(self,k,v):
            ident = get_ident()
            if ident in self.storage:
                self.storage[ident][k]=v
            else:
                self.storage[ident]={k:v}
    
    
        #从storage中取数据
        def get(self,k):
            ident = get_ident()
            return self.storage[ident][k]
    
    obj = Local()
    
    def task(arg):
        obj.set('val',arg)
        time.sleep(2)
        s = obj.get('val')
        print(s)
    
    
    
    for  i in range(10):
        t = Thread(target=task,args=(i,))
        t.start()
    View Code

    基于双下方法实现的自定义Local对象(基于线程(协程))

    # from threading import  Thread
    # from threading import get_ident
    # import time
    #
    #
    # class Scot:
    #     storage = {}
    #     #往storage中放数据
    #     def __setattr__(self,k,v):
    #         ident = get_ident()
    #         if ident in storage:
    #             storage[ident][k]=v
    #         else:
    #             storage[ident]={k:v}
    #
    #
    #     #从storage中取数据
    #     def __getattr__(self,k):
    #         ident = get_ident()
    #         return storage[ident][k]
    #
    # scot = Scot()
    #
    # def task(arg):
    #     scot.val=arg
    #     print(scot.val)
    #
    #
    #
    # for  i in range(10):
    #     t = Thread(target=task,args=(i,))
    #     t.start()
    
    
    '''
    如果这么写如果要实例出多个对象,那么数据都是放在同一个storage中的
    想要把他们隔离开,也就是对象都有自己的{},下面代码就实现了
    
    '''
    
    from threading import  Thread
    try:
        from greenlet import getcurrent as get_ident
    except Exception:
        from threading import get_ident     #基于线程来做的
    import time
             #基于协程做的 ,两种都可以
    
    class Local:
        # storage = {}
        def __init__(self):
            # self.storage={}       #如果没有使用父类的__setattr__,也就是没有第51行的话,这一句代码还没有创建字典就调用了自己的
            # __setattr__方法,在else中又调用__setattr__,就一直在调用,所以就出问题了,所以使用父类的这个方法就不会出现问题了
            object.__setattr__(self,'storage',{})
    
    
        #往storage中放数据
        def __setattr__(self,k,v):
            ident = get_ident()
            if ident in self.storage:
                self.storage[ident][k]=v
            else:
                self.storage[ident]={k:v}
    
    
        #从storage中取数据
        def __getattr__(self,k):
            ident = get_ident()
            return self.storage[ident][k]
    
    obj = Local()
    
    def task(arg):
        obj.val=arg
        print(obj.val)
    
    
    
    for  i in range(10):
        t = Thread(target=task,args=(i,))
        t.start()
    View Code
  • 相关阅读:
    python ascii codec can't decode
    python文件编码说明 coding=utf-8
    windbg的使用
    在后台运行Python脚本服务
    ubuntu下更改分辨率
    【转】VC调试的时候 “没有调试信息,未加载符号”
    常用正则表达式——中文匹配、拉丁匹配
    SQL的经典操作——批量复制同行的其它列数据到其它列数据
    关于C++对汉字拼音的处理(3)
    关于环境变量设置是否需要重启的问题
  • 原文地址:https://www.cnblogs.com/dwenwen/p/9092114.html
Copyright © 2020-2023  润新知