V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
defias
V2EX  ›  Python

python 中多线程共享全局变量的问题?

  •  1
     
  •   defias · Jan 19, 2016 · 10698 views
    This topic created in 3757 days ago, the information mentioned may be changed or developed.
    代码有多个文件组成,如下:

    ggg.py:
    -------------------
    #coding=utf8

    #定义全局变量
    isflag = False
    --------------------


    mmm.py:
    -------------------
    #coding=utf8
    from ggg import *
    import threading
    import time


    class mmm(threading.Thread):
    def __init__(self):
    threading.Thread.__init__(self)

    def run(self):
    global isflag
    print 'mmm isflag id: ', id(isflag)
    print 'mmm isflag: ', isflag

    while not isflag:
    print 'mmm isflag id: ', id(isflag)
    print 'mmm isflag: ', isflag
    print 'sleep...\n'
    time.sleep(0.5)
    print 'sleep end\n'

    --------------------



    testglobal.py:
    -------------------
    #coding=utf8
    from ggg import *
    import threading
    import time
    import mmm

    class subc(threading.Thread):
    def __init__(self):
    threading.Thread.__init__(self)

    def run(self):
    print 'sleep 3s...\n'
    time.sleep(3)
    print 'sleep 3s end\n'

    global isflag
    print 'subc isflag id: ', id(isflag)
    isflag = True
    print 'subc isflag: ', isflag


    t2 = mmm.mmm()
    t2.setDaemon(True)
    t2.start()


    t1 = subc()
    t1.setDaemon(True)
    t1.start()


    t2.join()
    print '---'
    --------------------

    执行:python testglobal.py
    运行结果: subc 线程中改变 isflag 为 True 后, mmm 线程中 isflag 仍然为 False 。
    没理解这里为啥会这样,全局变量不是在多线程中共享的吗?
    Supplement 1  ·  Jan 20, 2016

    重写将问题使用 makedown 格式化了

    代码由多个文件组成,如下:

    ggg.py:

    #coding=utf8 
    #定义全局变量,初始值为 False
    
    isflag = False
    

    mmm.py:

    #coding=utf8 
    from ggg import * 
    import threading 
    import time 
    
    class mmm(threading.Thread):
        def __init__(self): 
            threading.Thread.__init__(self) 
    
        def run(self): 
            global isflag 
            print 'mmm isflag id: ', id(isflag) 
            print 'mmm isflag: ', isflag 
    
            while not isflag: 
                print 'mmm isflag id: ', id(isflag) 
                print 'mmm isflag: ', isflag 
                print 'sleep...\n' 
                time.sleep(0.5) 
                print 'sleep end\n'
    

    testglobal.py:

    #coding=utf8 
    from ggg import * 
    import threading 
    import time 
    import mmm 
    
    class subc(threading.Thread): 
        def __init__(self): 
            threading.Thread.__init__(self) 
    
        def run(self): 
            print 'sleep 3s...\n' 
            time.sleep(3) 
            print 'sleep 3s end\n' 
    
            global isflag 
            print 'subc isflag id: ', id(isflag) 
            isflag = True 
            print 'subc isflag: ', isflag 
    
    
    t2 = mmm.mmm() 
    t2.setDaemon(True) 
    t2.start() 
    
    
    t1 = subc() 
    t1.setDaemon(True) 
    t1.start() 
    
    
    t2.join() 
    print '---'
    

    执行: python testglobal.py

    运行结果: subc 线程中改变全局变量 isflag 为 True 后, mmm 线程中 isflag 仍然为 False 。

    没理解这里为啥会这样,全局变量不是在多线程中共享的吗?

    5 replies    2017-03-02 10:50:26 +08:00
    billgreen1
        1
    billgreen1  
       Jan 19, 2016
    我最近也在看多进程 /多线程问题,请把问题用 markown 再发一遍,谢谢。
    haofly
        2
    haofly  
       Jan 19, 2016
    要改变全局变量得用锁啊
    mengzhuo
        3
    mengzhuo  
       Jan 20, 2016 via iPhone
    改成
    import ggg
    ggg.isflag = xxx
    defias
        4
    defias  
    OP
       Jan 20, 2016
    3 楼的果然可以哦
    zonghua
        5
    zonghua  
       Mar 2, 2017
    @mengzhuo 模块变量再赋值到灵位一个参数呢 比如说 ggg_is_flag = ggg.isflag
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   871 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 22:57 · PVG 06:57 · LAX 15:57 · JFK 18:57
    ♥ Do have faith in what you're doing.