Python高级(19)—线程之ThreadLocal

◎知识点

  1. 为什么需要ThreadLocal

  2. 什么是ThreadLocal


◎脚本练习

▽ 为什么需要ThreadLocal

"""
    多线程操作共享的全局变量是不安全的。那局部变量呢?
    局部变量只归某个线程私有,其它线程是无法访问的。但是,在线程内操作局部变量也存在问题:
    如果线程内有多个函数都需要访问多个局部变量,则需要将这些局部都作为实参分别传递给这些函数。
这样,传递参数就会很麻烦。
"""

import threading

def do_sth(arg1, arg2, arg3):
    local_var1 = arg1
    local_var2 = arg2
    local_var3 = arg3

    fun1(local_var1, local_var2, local_var3)
    fun2(local_var1, local_var2, local_var3)
    fun3(local_var1, local_var2, local_var3)

def fun1(local_var1, local_var2, local_var3):
    print('%s: %s -- %s -- %s' % (threading.current_thread().name, local_var1,
                        local_var2, local_var3))

def fun2(local_var1, local_var2, local_var3):
    print('%s: %s -- %s -- %s' % (threading.current_thread().name, local_var1,
                                  local_var2, local_var3))

def fun3(local_var1, local_var2, local_var3):
    print('%s: %s -- %s -- %s' % (threading.current_thread().name, local_var1,
                                  local_var2, local_var3))

t1 = threading.Thread(target=do_sth, args=('a', 'b', 'c'))
t2 = threading.Thread(target=do_sth, args=('d', 'e', 'f'))

t1.start()
t2.start()


▽ 什么是ThreadLocal

"""
    ThreadLocal是一个全局变量,用来存放各个线程的局部变量。ThreadLocal中会维护
"某个线程 - 该线程内的某个局部变量名 - 该局部变量的值"的映射。
    在线程中将局部变量写入ThreadLocal的语法格式为: threadlocal.局部变量名 = 局部变量值;
在线程中从ThreadLocal中读取局部变量的语法格式为: threadlocal.局部变量名。
"""

from threading import Thread, local, current_thread

thread_local = local()

def do_sth(arg1, arg2, arg3):
    thread_local.local_var1 = arg1
    thread_local.local_var2 = arg2
    thread_local.local_var3 = arg3

    fun1()
    fun2()
    fun3()

def fun1():
    print('%s: %s -- %s -- %s' % (current_thread().name, thread_local.local_var1,
                                  thread_local.local_var2,
                                  thread_local.local_var3))

def fun2():
    print('%s: %s -- %s -- %s' % (current_thread().name, thread_local.local_var1,
                                  thread_local.local_var2,
                                  thread_local.local_var3))

def fun3():
    print('%s: %s -- %s -- %s' % (current_thread().name, thread_local.local_var1,
                                  thread_local.local_var2,
                                  thread_local.local_var3))

t1 = Thread(target=do_sth, args=('a', 'b', 'c'))
t2 = Thread(target=do_sth, args=('d', 'e', 'f'))

t1.start()
t2.start()


◎脚本地址:https://github.com/anzhihe/learning/blob/master/python/practise/learn-python/python_senior/threadlocal.py

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/5630.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注