资讯专栏INFORMATION COLUMN

python学习笔记 - ThreadLocal

Berwin / 2448人阅读

摘要:为了避免改乱为,我们在前面已经提到说要加锁。仅供一个线程使用,线程间相互不影响。例如下列程序中函数中定义的变量就是局部变量。所有绑定的参数都是线程隔离的。下面展示一下代码创建一个全局的对象初始化一个线程内变量,该变量线程间互不影响。

我们在编写多线程程序的时候,往往会遇到两种类型的变量。

一种是全局变量,多个线程共享。为了避免改乱为,我们在前面已经提到说要加锁。

一种是局部变量。仅供一个线程使用,线程间相互不影响。

例如下列程序中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

相关文章

  • 【Java笔记ThreadLocal学习和理解

    摘要:底层是一个的散列表可扩容的数组,并采用开放地址法来解决冲突。稍后讨论方法每个对象都有一个值,每初始化一个对象,值就增加一个固定的大小。因此在使用的时候要手动调用方法,防止内存泄漏。 ThreadLocal定义 先看JDK关于ThreadLocal的类注释: This class provides thread-local variables. These variables diffe...

    red_bricks 评论0 收藏0
  • 06.Android之消息机制问题

    摘要:通过向消息池发送各种消息事件通过处理相应的消息事件。子线程往消息队列发送消息,并且往管道文件写数据,主线程即被唤醒,从管道文件读取数据,主线程被唤醒只是为了读取消息,当消息读取完毕,再次睡眠。 目录介绍 6.0.0.1 谈谈消息机制Hander作用?有哪些要素?流程是怎样的? 6.0.0.2 为什么一个线程只有一个Looper、只有一个MessageQueue,可以有多个Handle...

    Aomine 评论0 收藏0
  • 深入理解Python中的ThreadLocal变量(中)

    摘要:在深入理解中的变量上中我们看到的引入,使得可以很方便地在多线程环境中使用局部变量。特别需要注意的是,基类的并不会屏蔽派生类中的创建。到此,整个源码核心部分已经理解的差不多了,只剩下用来执行清除工作。 在 深入理解Python中的ThreadLocal变量(上) 中我们看到 ThreadLocal 的引入,使得可以很方便地在多线程环境中使用局部变量。如此美妙的功能到底是怎样实现的?如果你...

    DataPipeline 评论0 收藏0
  • Android异步消息机制

    摘要:在子线程中发送消息,主线程接受到消息并且处理逻辑。子线程往消息队列发送消息,并且往管道文件写数据,主线程即被唤醒,从管道文件读取数据,主线程被唤醒只是为了读取消息,当消息读取完毕,再次睡眠。 目录介绍 1.Handler的常见的使用方式 2.如何在子线程中定义Handler 3.主线程如何自动调用Looper.prepare() 4.Looper.prepare()方法源码分析 5....

    blair 评论0 收藏0
  • 深入理解Python中的ThreadLocal变量(下)

    摘要:具体怎么实现的呢,思想其实特别简单,我们在深入理解中的变量上一文的最后有提起过,就是创建一个全局字典,然后将线程或者协程标识符作为,相应线程或协程的局部数据作为。 在上篇我们看到了 ThreadLocal 变量的简单使用,中篇对python中 ThreadLocal 的实现进行了分析,但故事还没有结束。本篇我们一起来看下Werkzeug中ThreadLocal的设计。 Werkzeug...

    dadong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<