• threading.local学习


    多线程抢占问题

    import time
    import threading
    
    obj = 5
    
    def task(arg):
        global obj
        obj = arg
        time.sleep(1)
        print(obj)
    
    for i in range(6):
        t = threading.Thread(target=task, args=(i,))
        t.start()
    
    
    # 结果
    5
    5
    5
    5
    5
    5
    

      

    threading.local对象避免线程抢占

    为每个线程开辟一块内存空间,存储各自的数据

    import time
    import threading
    
    obj = threading.local()
    
    def task(arg):
        global obj
        obj.value = arg
        time.sleep(1)
        print(obj.value)
    
    for i in range(6):
        t = threading.Thread(target=task, args=(i,))
        t.start()
    
    # 结果
    0
    3
    4
    5
    2
    1
    

      

     模拟threading.local

    import time
    import threading
    # 获取线程的唯一标识
    from threading import get_ident
    
    class Local():
        def __init__(self):
            self.storage = {}
        def __setitem__(self, key, value):
            ident = get_ident()
            if ident in self.storage:
                self.storage[ident][key] = value
            else:
                self.storage[ident] = {key:value}
        def __getitem__(self, item):
            ident = get_ident()
            return self.storage[ident][item]
    
    obj = Local()
    
    def task(arg):
        obj['num'] = arg
        time.sleep(1)
        print(obj['num'])
    
    for i in range(6):
        t = threading.Thread(target=task, args=(i,))
        t.start()
    

      

    粒度精确到协程

    为每个协程开辟一块内存空间,存储各自的数据

    import time
    import threading
    try:
        # 获取协程的唯一标识
        from greenlet import getcurrent as get_ident
    except Exception as e:
        from threading import get_ident
    
    class Local():
        def __init__(self):
            self.storage = {}
        def __setitem__(self, key, value):
            ident = get_ident()
            if ident in self.storage:
                self.storage[ident][key] = value
            else:
                self.storage[ident] = {key:value}
        def __getitem__(self, item):
            ident = get_ident()
            try:
                return self.storage[ident][item]
            except Exception as e:
                return None
    
    obj = Local()
    
    def task(arg):
        obj['num'] = arg
        time.sleep(1)
        print(obj['num'])
    
    for i in range(6):
        t = threading.Thread(target=task, args=(i,))
        t.start()
    

      

  • 相关阅读:
    windows下忘记mysql超级管理员rootpassword的解决的方法
    LeetCode226 InvertBinaryTree Java题解
    PHP利用GD库绘图和生成验证码图片
    自己动手开发IOC容器
    智能提示(一) Solr (suggest)
    Linux系统字符集乱码问题
    Linux
    [Material Design] 教你做一个Material风格、动画的button(MaterialButton)
    codeforces#FF(div2) D DZY Loves Modification
    鼠标滚轮实现图片的缩放-------Day79
  • 原文地址:https://www.cnblogs.com/standby/p/9054099.html
Copyright © 2020-2023  润新知