Discuss / Python / local_school.student和某线程的接口在哪里?

local_school.student和某线程的接口在哪里?

Topic source

梦炸

#1 Created at ... [Delete] [Delete and Lock User]
def process_student():
    # 获取当前线程关联的student:
    std = local_school.student
    print('Hello, %s (in %s)' % (std, threading.current_thread().name))

def process_thread(name):
    # 绑定ThreadLocal的student:
    local_school.student = name
    process_student()

t1 = threading.Thread(target= process_thread, args=('Alice',), name='Thread-A')

上面代码中local_school是一个ThreadLocal全局对象,student和teacher等都可以是他的属性,属性对应的是一个字典,字典里存的是每个线程对应的student值,这样就可以在同个线程的不同函数里调用相同的值。我理解的对吗?

问题来了:对于这个进程t1 = threading.Thread(target= process_thread, args=('Alice',), name='Thread-A')这句是把“Alice”传到函数local_school.student这个对象的属性的值里。想问线程的名字是怎么穿进去的,是local_school这个对象是用threading.current_thread()方法自动获得当前线程名称,对吗?

Tommy_Chiu

#2 Created at ... [Delete] [Delete and Lock User]

threading.Thread()先把args传到target指定的函数里面,例子中是process_thread(),这个函数里面将args赋值给local_school.student,然后调用函数里面的process_student(),因为local_school是一个全局对象,所以在process_student()可以针对这个线程进行赋值,也就是最终的std=local_school.student=name=args

代号九DZ

#3 Created at ... [Delete] [Delete and Lock User]

Thread(group=None, target=None, name=None, args=(), kwargs={})

  group: 线程组,目前还没有实现,库引用中提示必须是None;   target: 要执行的方法;   name: 线程名;   args/kwargs: 要传入方法的参数。

name是供thread调度用的,local_school不保存它, dir(local_school)可以发现没有这个属性

廖老师不是说了?内部会处理,至于怎么处理,我觉得现在不要搞得这么细吧

全局变量local_school就是一个ThreadLocal对象,每个Thread对它都可以读写student属性,但互不影响。你可以把local_school看成全局变量,但每个属性如local_school.student都是线程的局部变量,可以任意读写而互不干扰,也不用管理锁的问题,ThreadLocal内部会处理

烈可烈

#6 Created at ... [Delete] [Delete and Lock User]

threadname那个你不用管,小东西,和threadLocal无关; 你的所谓关联的接口,可以看这个java中的threadLocal

里面有javathreadlocal源码分析,应该Python的原理也是一样的。

但其实最核心的原理就是,thread本身持有了一个属性来管理,你想想每一个实例的属性肯定都是互不干扰的,所以每一个thread(作为实例)的threadLocal也是独立的。

ywjco_567

#7 Created at ... [Delete] [Delete and Lock User]

接口是这个:

def process_thread(name):
    # 绑定ThreadLocal的student:
    local_school.student = name

  • 1

Reply