zoukankan      html  css  js  c++  java
  • Python 本地线程

    1. 本地线程,保证即使是多个线程,自己的值也是互相隔离。

    2.普通对象演示

    import  threading
    import time
    
    
    class  A():
        pass
    
    a=A()
    
    def func(num):
        a.name=num
        time.sleep(1)
        print(a.name,threading.current_thread().name)

    结果

    D:virtualenvenvsvuedjangoScriptspython.exe D:/test/flaskTest/flaskpro3/本地线程.py
    4 线程1
    4 线程0
    4 线程3
    4 线程2
    4 线程4
    
    Process finished with exit code 0

    因为需要sleep最后a.name所得到的值都是最后一个了,无法保证每个线程所对应的值是自己本该对应的值

    3.本地线程对象演示

    import threading
    import time
    # 本地线程对象
    local_values = threading.local()
    
    def func(num):
    
        """
        # 第一个线程进来,本地线程对象会为他创建一个
        # 第二个线程进来,本地线程对象会为他创建一个
        {
            线程1的唯一标识:{name:1},
            线程2的唯一标识:{name:2},
        }
        
        #注意这里是我自己假设的
        :param num: 
        :return: 
        """
        local_values.name = num
        # 线程停下来了
        time.sleep(2)
        # 第二个线程: local_values.name,去local_values中根据自己的唯一标识作为key,获取value中name对应的值
        print(local_values.name, threading.current_thread().name)
    
    
    for i in range(5):
        th = threading.Thread(target=func, args=(i,), name='线程%s'%i)
        th.start()

    结果

    1 线程1
    0 线程0
    3 线程3
    2 线程2
    4 线程4

    使用本地线程,每次线程进来后(执行函数),都会创建一个当前线程的唯一标识,并把本地线程的值保存起来,形成一一对应的关系,后面即使线程等待了,也不会全部将值变成最后一个,当然线程执行顺序不能确定,但是它对应的值肯定是他执行函数时她的唯一标识所对应的值

    参考Flask上下文源码就知道他就是为每个线程创建唯一标识,这里参考她的源码把本地线程的结构设计的和她的一样

  • 相关阅读:
    896. Monotonic Array单调数组
    865. Smallest Subtree with all the Deepest Nodes 有最深节点的最小子树
    489. Robot Room Cleaner扫地机器人
    JavaFX
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
  • 原文地址:https://www.cnblogs.com/ctztake/p/8213882.html
Copyright © 2011-2022 走看看