资讯专栏INFORMATION COLUMN

多线程中的局部变量

bitkylin / 2968人阅读

摘要:在实现多线程业务时,如果没有涉及到共享数据处理的业务,还是使用局部变量,必将,在处理共享数据时,还是需要加锁线程与线程间的局部变量相互独立,变量的处理互补干扰。

在实现多线程业务时,如果没有涉及到共享数据处理的业务,还是使用局部变量,必将,在处理共享数据时,还是需要加锁;线程与线程间的局部变量相互独立,变量的处理互补干扰。

在多线程的场景下,针对线程中的局部变量,如果需要让其他业务操作此变量时,此时

局部变量相对当前线程来讲,是全局变量;

局部变量相对其他线程来讲,是局部变量;

为了实现当前线程的局部变量被部分业务处理时,以两个小例子说明下

示例 1:自定义全局变量,以当前线程做为 key
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals

from threading import current_thread, Thread

global_variable = {}


def handler():
    std = global_variable[current_thread()]
    print "Hello {} and this thread"s name is {}".format(std, current_thread().name)


def test_thread(name):
    global_variable[current_thread()] = name
    handler()


t1 = Thread(target=test_thread, args=("Kobe", ), name="thread_kobe")
t2 = Thread(target=test_thread, args=("TMC", ), name="thread_tmc")

t1.start()
t2.start()

t1.join()
t2.join()

print global_variable
print "end......"

运行结果:

Hello Kobe and this thread"s name is thread_kobe
 Hello TMC and this thread"s name is thread_tmc
{: u"Kobe", : u"TMC"}
end......

这样,当前线程的数据不会被其他线程捕捉和处理,但是不建议这么做,毕竟 threading 模块提供了 local

示例 2:使用 local
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals

from threading import current_thread, Thread, local

local_variable = local()


def handler():
    std = local_variable.name
    print "Hello {} and this thread"s name is {}".format(std, current_thread().name)


def test_thread(name):
    local_variable.name = name
    handler()


t1 = Thread(target=test_thread, args=("Kobe", ), name="thread_kobe")
t2 = Thread(target=test_thread, args=("TMC", ), name="thread_tmc")

t1.start()
t2.start()

t1.join()
t2.join()

print local_variable
print "end......"

运行结果如下:

Hello Kobe and this thread"s name is thread_kobe
Hello TMC and this thread"s name is thread_tmc

end......

参考

http://yangcongchufang.com/%E...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38640.html

相关文章

  • 深入理解Python中的ThreadLocal变量(上)

    摘要:我们知道多线程环境下,每一个线程均可以使用所属进程的全局变量。在线程中使用局部变量则不存在这个问题,因为每个线程的局部变量不能被其他线程访问。 我们知道多线程环境下,每一个线程均可以使用所属进程的全局变量。如果一个线程对全局变量进行了修改,将会影响到其他所有的线程。为了避免多个线程同时对变量进行修改,引入了线程同步机制,通过互斥锁,条件变量或者读写锁来控制对全局变量的访问。 只用全局变...

    huangjinnan 评论0 收藏0
  • 并发学习笔记(1)

    摘要:共享数据使线程之间的通信比进程之间的通信更有效。并发模型和的区别说明的作用是启动一个新线程操作系统级别,有一个方法启动新线程,新线程会执行相应的方法。单独调用会在当前线程中执行并不会启动新线程创建一个线程即可但是这个线程没有执行任何代码段。 tutorials site 并发Concurrency发展的历史 单CPU,一次只能运行一个程序 -- 多任务,一次同时运行多个任...

    objc94 评论0 收藏0
  • (基础系列)ThreadLocal的用法、原理和用途

    摘要:那线程局部变量就是每个线程都会有一个局部变量,独立于变量的初始化副本,而各个副本是通过线程唯一标识相关联的。移除此线程局部变量当前线程的值。如果此线程局部变量随后被当前线程读取,且这期间当前线程没有设置其值,则将调用其方法重新初始化其值。 前言 ThreadLocal网上资料很多,那我为什么还要写下这篇文章呢?主要是想汇聚多篇文章的优秀之处以及我对于ThreadLocal的理解来加深印...

    bitkylin 评论0 收藏0
  • Java线程的生命周期

    摘要:线程的生命周期线程的生命周期大致可以分为下面五种状态新建状态就绪状态运行状态休眠状态终止状态新建状态,是线程被创建且未启动的状态这里的创建,仅仅是在的这种编程语言层面被创建,而在操作系统层面,真正的线程还没有被创建。 概要 目前CPU的运算速度已经达到了百亿次每秒,甚至更高的量级,家用电脑即使维持操作系统正常运行的进程也会有数十个,线程更是数以百计。 线程是CPU的调度和分派的基本单位...

    ivyzhang 评论0 收藏0
  • Java线程基础-ThreadLocal

    摘要:并没有提供语言级的线程局部变量,而是在类库里提供了线程局部变量的功能,也就是这次的主角类。 Yuicon 转载请注明原创出处,谢谢! 序 在多线程环境下,访问非线程安全的变量时必须进行线程同步,例如使用synchronized方式访问HashMap实例。但是同步访问会降低并发性,影响系统性能。这时候就可以用空间换时间,如果我们给每个线程都分配一个独立的变量,就可以用非同步的方式使用非...

    JasonZhang 评论0 收藏0

发表评论

0条评论

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