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

  • 相关阅读:
    斗鱼的sidebar的实现简陋的demo
    angular JS中使用jquery datatable添加checkbox点击事件
    angular JS中使用jquery datatable添加ng-click事件
    Redis 中文文档
    操作word的
    Redis作为消息队列服务场景应用案例(入队和出队)
    nopcommerce 商城案例
    net 将手机号码中间的数字替换成星号
    V5客服
    EF 数据库迁移(Migration)
  • 原文地址:https://www.cnblogs.com/ctztake/p/8213882.html
Copyright © 2011-2022 走看看