摘要:为了避免改乱为,我们在前面已经提到说要加锁。仅供一个线程使用,线程间相互不影响。例如下列程序中函数中定义的变量就是局部变量。所有绑定的参数都是线程隔离的。下面展示一下代码创建一个全局的对象初始化一个线程内变量,该变量线程间互不影响。
我们在编写多线程程序的时候,往往会遇到两种类型的变量。
一种是全局变量,多个线程共享。为了避免改乱为,我们在前面已经提到说要加锁。
一种是局部变量。仅供一个线程使用,线程间相互不影响。
例如下列程序中task()函数中定义的count变量就是局部变量。即使我们创建了两个线程,两者的count递增也不会相互影响,因为count是在task中定义的。
import threading def task(): count = 0 for i in range(1000): count += 1 print count if __name__ == "__main__": t1 = threading.Thread(target=task) t1.start() t2 = threading.Thread(target=task) t2.start()
那么,这么处理是不是就完美了呢?其实还不是。
以上的例子我们举的是一个非常简单的例子,但是我们遇到一个比较复杂的业务逻辑的时候,比如多个局部变量,函数多重调用等,这么定义局部变量就会变得不简洁,麻烦。
函数多重调用是指,例如:
我们定义了函数,methodA(),这个方法体内调用了methodB(), methodB()方法体中又调用了methodC()...
如果我们在某一个线程中调用了methodA()并且使用了一个变量attr,那么我们就需要将attr一层一层地传递给后续的函数。
有没有一种方法,能让我们在线程中定义一个变量后,那么这个线程中的函数就都能调用,如此才叫简洁明了?
Python为我们做到了,那就是ThreadLocal.
ThreadLocal的用法只需要三步:
定义一个对象 threading.local
在线程内给该对象绑定参数。所有绑定的参数都是线程隔离的。
在线程内调用。
下面展示一下代码:
# coding=utf-8 import threading local = threading.local() # 创建一个全局的对象 def task(): local.count = 0 # 初始化一个线程内变量,该变量线程间互不影响。 for i in range(1000): count_plus() def count_plus(): local.count += 1 print threading.current_thread().name, local.count if __name__ == "__main__": t1 = threading.Thread(target=task) t1.start() t2 = threading.Thread(target=task) t2.start()
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/38436.html
摘要:底层是一个的散列表可扩容的数组,并采用开放地址法来解决冲突。稍后讨论方法每个对象都有一个值,每初始化一个对象,值就增加一个固定的大小。因此在使用的时候要手动调用方法,防止内存泄漏。 ThreadLocal定义 先看JDK关于ThreadLocal的类注释: This class provides thread-local variables. These variables diffe...
摘要:通过向消息池发送各种消息事件通过处理相应的消息事件。子线程往消息队列发送消息,并且往管道文件写数据,主线程即被唤醒,从管道文件读取数据,主线程被唤醒只是为了读取消息,当消息读取完毕,再次睡眠。 目录介绍 6.0.0.1 谈谈消息机制Hander作用?有哪些要素?流程是怎样的? 6.0.0.2 为什么一个线程只有一个Looper、只有一个MessageQueue,可以有多个Handle...
摘要:在深入理解中的变量上中我们看到的引入,使得可以很方便地在多线程环境中使用局部变量。特别需要注意的是,基类的并不会屏蔽派生类中的创建。到此,整个源码核心部分已经理解的差不多了,只剩下用来执行清除工作。 在 深入理解Python中的ThreadLocal变量(上) 中我们看到 ThreadLocal 的引入,使得可以很方便地在多线程环境中使用局部变量。如此美妙的功能到底是怎样实现的?如果你...
摘要:在子线程中发送消息,主线程接受到消息并且处理逻辑。子线程往消息队列发送消息,并且往管道文件写数据,主线程即被唤醒,从管道文件读取数据,主线程被唤醒只是为了读取消息,当消息读取完毕,再次睡眠。 目录介绍 1.Handler的常见的使用方式 2.如何在子线程中定义Handler 3.主线程如何自动调用Looper.prepare() 4.Looper.prepare()方法源码分析 5....
摘要:具体怎么实现的呢,思想其实特别简单,我们在深入理解中的变量上一文的最后有提起过,就是创建一个全局字典,然后将线程或者协程标识符作为,相应线程或协程的局部数据作为。 在上篇我们看到了 ThreadLocal 变量的简单使用,中篇对python中 ThreadLocal 的实现进行了分析,但故事还没有结束。本篇我们一起来看下Werkzeug中ThreadLocal的设计。 Werkzeug...
阅读 1893·2021-11-24 11:16
阅读 3256·2021-09-10 10:51
阅读 3179·2021-08-03 14:03
阅读 1260·2019-08-29 17:03
阅读 3238·2019-08-29 12:36
阅读 2218·2019-08-26 14:06
阅读 492·2019-08-23 16:32
阅读 2660·2019-08-23 13:42