zoukankan      html  css  js  c++  java
  • 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()
    

      

  • 相关阅读:
    Mastering Web Application Development with AngularJS 读书笔记-前记
    通过信息系统项目管理师-我的备考经验
    通过系统集成项目管理工程师考试-我的备考分享
    即将翻译 Building The New Financial Times Web App
    CSS3:flex布局应用
    前端性能利器——dynatrace ajax edition
    SIMD---AVX系列
    DirectSound---捕获音频、Qml/C++ 集成交互
    SIMD---SSE系列及效率对比
    SIMD---MMX代码优化
  • 原文地址:https://www.cnblogs.com/standby/p/9054099.html
Copyright © 2011-2022 走看看