V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 · 2016-01-19 18:46:17 +08:00 · 10012 次点击
    这是一个创建于 3267 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码有多个文件组成,如下:

    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 。
    没理解这里为啥会这样,全局变量不是在多线程中共享的吗?
    第 1 条附言  ·  2016-01-20 09:50:24 +08:00

    重写将问题使用 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 条回复    2017-03-02 10:50:26 +08:00
    billgreen1
        1
    billgreen1  
       2016-01-19 19:30:30 +08:00
    我最近也在看多进程 /多线程问题,请把问题用 markown 再发一遍,谢谢。
    haofly
        2
    haofly  
       2016-01-19 21:12:14 +08:00
    要改变全局变量得用锁啊
    mengzhuo
        3
    mengzhuo  
       2016-01-20 07:23:35 +08:00 via iPhone
    改成
    import ggg
    ggg.isflag = xxx
    defias
        4
    defias  
    OP
       2016-01-20 10:04:15 +08:00
    3 楼的果然可以哦
    zonghua
        5
    zonghua  
       2017-03-02 10:50:26 +08:00
    @mengzhuo 模块变量再赋值到灵位一个参数呢 比如说 ggg_is_flag = ggg.isflag
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   977 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:00 · PVG 03:00 · LAX 11:00 · JFK 14:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.