您好,欢迎来到汇意旅游网。
搜索
您的当前位置:首页python怎么定义线程局部变量

python怎么定义线程局部变量

来源:汇意旅游网
有个概念叫做线程局部变量,一般我们对多线程中的全局变量都会加锁处理,这种变量是共享变量,每个线程都可以读写变量,为了保持同步我们会做枷锁处理。

但是有些变量初始化以后,我们只想让他们在每个线程中一直存在,相当于一个线程内的共享变量,线程之间又是隔离的,就是局部变量。python threading模块中就提供了这么一个类,叫做local。(推荐学习:Python视频教程)

使用局部变量的时候,需要传递参数,比如有这样一个例子,程序需要处理客户申请,每来一个客户,就新开一个线程进行处理,而客户有姓名、年龄、性别等属性(参数),如果都需要传递参数的话很繁琐。Python提供了threading.local模块,方便我们实现线程局部变量的传递。直接看下面的例子:

# /usr/bin/env python
# coding:utf-8


import threading

# Threading.local对象
ThreadLocalHelper = threading.local()
lock = threading.RLock()

class MyTheadEx(threading.Thread):
 def __init__(self, threadName, name, age, sex):
 super(MyTheadEx, self).__init__(name=threadName)
 self.__name = name
 self.__age = age
 self.__sex = sex

 def run(self):
 global ThreadLocalHelper
 ThreadLocalHelper.ThreadName = self.name
 ThreadLocalHelper.Name = self.__name
 ThreadLocalHelper.Age = self.__age
 ThreadLocalHelper.Sex = self.__sex
 MyTheadEx.ThreadPoc()

 # 线程处理函数
 @staticmethod
 def ThreadPoc():
 lock.acquire()
 try:
 print 'Thread={id}'.format(id=ThreadLocalHelper.ThreadName)
 print 'Name={name}'.format(name=ThreadLocalHelper.Name)
 print 'Age={age}'.format(age=ThreadLocalHelper.Age)
 print 'Sex={sex}'.format(sex=ThreadLocalHelper.Sex)
 print '----------'
 finally:
 lock.release()

if __name__ == '__main__':
 Tom = {'Name': 'tom', 'Age': 20, 'Sex': 'man'}
 xiaohua = {'Name': 'xiaohua', 'Age': 18, 'Sex': 'woman'}
 Andy = {'Name': 'Andy', 'Age': 40, 'Sex': 'man'}
 T = (Tom, xiaohua, Andy)
 threads = []
 for i in range(len(T)):
 t = MyTheadEx(threadName='id_{0}'.format(i), name=T[i]['Name'], age=T[i]['Age'], sex=T[i]['Sex'])
 threads.append(t)
 for i in range(len(threads)):
 threads[i].start()
 for i in range(len(threads)):
 threads[i].join()
 print 'All Done!!!'

可见,每个线程都可以对threading.local对象进行读写,且互相不干扰。合理使用threading.local可以极大简化代码逻辑,同时保证各个子线程的数据安全。Threading.local最大的用处就是HTTP请求时绑定用户的信息,这样每个用户线程可以非常方便访问各自的资源而互不干扰。

更多Python相关技术文章,请访问Python教程栏目进行学习!

Copyright © 2019- hids.cn 版权所有 赣ICP备2024042780号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务