zoukankan      html  css  js  c++  java
  • [Python]threading local 线程局部变量小測试

    概念     

    有个概念叫做线程局部变量。一般我们对多线程中的全局变量都会加锁处理,这样的变量是共享变量,每一个线程都能够读写变量,为了保持同步我们会做枷锁处理。可是有些变量初始化以后。我们仅仅想让他们在每一个线程中一直存在。相当于一个线程内的共享变量,线程之间又是隔离的。python threading模块中就提供了这么一个类,叫做local。


    多线程中共享变量和局部变量的差别我画两个小图。简单描写叙述下(作图能力一般。请见谅,概念性的东西大家能够google下,非常多好文章)


    全局变量



    线程局部变量



    对照:

    以下是3个小样例。各自是使用local局部变量。 全局变量, gevent中的local来看线程对变量的操作是否隔离。

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # python2.7x
    # author: orangelliu
    # date: 2014-08-20
    
    '''
    线程本地变量  初始值定义之后,在线程中能够保持隔离性
    为了做对照,分别和全局变量,gevent线程对照
    
    线程局部变量
    '''
    
    from time import sleep
    from random import random
    from threading import Thread, local
    
    data = local()
    
    def bar():
        print 'called from %s'%data.v
    
    def foo():
        data.v = str(data.v) + '.......'
        bar()
    
    class T(Thread):
        def run(self):
            sleep(random())
            data.v = self.getName()
            sleep(1)
            foo()
    
    T().start()
    T().start()

    运行结果:

    called from Thread-1.......
    called from Thread-2.......
    [Finished in 1.6s]

    能够看到每一个v仅仅在自己的线程中操作。


    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # python2.7x
    # author: orangelliu
    # date: 2014-08-20
    
    '''
    线程本地变量  初始值定义之后,在线程中能够保持隔离性
    为了做对照。分别和全局变量,gevent线程对照
    
    全局变量
    '''
    from time import sleep
    from random import random
    from threading import Thread, local
    
    #假设使用全局变量呢
    def bar1():
        global v
        print 'calledddddd from %s'%v
    
    def foo1():
        global v
        v = v + '.....'
        bar1()
    
    class T1(Thread):
        def run(self):
            global v
            sleep(random())
            v =self.getName()
            sleep(1)
            foo1()
    
    T1().start()
    T1().start()
    

    运行结果:

    calledddddd from Thread-1.....
    calledddddd from Thread-1..........
    [Finished in 1.8s

    能够看到v值在被2个线程都操作了。最后线程2仅仅是作了一个 再拼字符串的过程,由于线程1已经创建了全局变量v


    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # python2.7x
    # author: orangelliu
    # date: 2014-08-20
    
    '''
    线程本地变量  初始值定义之后。在线程中能够保持隔离性
    为了做对照,分别和全局变量,gevent线程对照
    
    gevent 协程
    '''
    
    import gevent
    from gevent.local import local
    
    data = local()
    
    def bar():
        print 'called from %s'%data.v
    
    def foo(v):
        data.v = v
        data.v = str(data.v) + '.......'
        bar()
    
    g1 = gevent.spawn(foo, '1')
    g2 = gevent.spawn(foo, '2')
    
    gevent.joinall([g1, g2])
    
    

    called from 1.......
    called from 2.......
    [Finished in 0.1s]


    类似线程的结果。


    本文出自 orangleliu笔记本 博客,请务必保留此出处http://blog.csdn.net/orangleliu/article/details/38741275
  • 相关阅读:
    .Net 应用中使用dot trace进行性能诊断
    MyBatis批量增删改查操作
    hadoop2.7.2基于centos全然分布式安装
    HDOJ 3666 THE MATRIX PROBLEM 差分约束
    BZOJ1635: [Usaco2007 Jan]Tallest Cow 最高的牛
    BZOJ1089: [SCOI2003]严格n元树
    BZOJ1406: [AHOI2007]密码箱
    BZOJ1270: [BeijingWc2008]雷涛的小猫
    BZOJ1211: [HNOI2004]树的计数
    BZOJ2729: [HNOI2012]排队
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7220233.html
Copyright © 2011-2022 走看看