V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Exin
V2EX  ›  问与答

碰到极其恶心的 Bug 要如何解决?

  •  
  •   Exin · 2015-10-02 01:00:44 +08:00 · 1767 次点击
    这是一个创建于 3156 天前的主题,其中的信息可能已经有所发展或是发生改变。
    写了个 Python 小程序,
    有一处出现了某个全局变量“不能修改”的情况,
    更甚者,一个函数里的一个变量直接 print 和 return 这个变量之后再 print 结果不一样的情况,
    排了俩小时我快疯了
    13 条回复    2015-10-02 15:24:58 +08:00
    Sylv
        1
    Sylv  
       2015-10-02 01:19:29 +08:00 via iPhone
    请先上代码
    Exin
        2
    Exin  
    OP
       2015-10-02 01:27:14 +08:00
    @Sylv 代码比较不堪入目,不太好意思上
    现在已经锁定问题了:
    =========================

    #coding:utf-8
    import multiprocessing

    globalVar = '?'

    def func1():
    global globalVar
    globalVar = '!'
    print 'in func1, globalVar =', globalVar

    def func2(arr):
    global globalVar
    print 'in func2, globalVar =', globalVar

    def main():
    global globalVar
    func1()
    print 'in main, globalVar =', globalVar

    pool = multiprocessing.Pool(processes = 1)
    pool.map(func2, [0])
    pool.close()
    pool.join()

    if __name__ == '__main__':
    main()

    输出:
    in func1, globalVar = !
    in main, globalVar = !
    in func2, globalVar = ?

    =====================
    似乎是 multiprocessing 有一份全局变量的原始备份,
    在它被调用之前即使更改了全局变量的值,它也不更新
    Sylv
        3
    Sylv  
       2015-10-02 01:35:27 +08:00 via iPhone
    Exin
        4
    Exin  
    OP
       2015-10-02 01:52:27 +08:00
    @Sylv 我也看过这个页面了,这里谈到的似乎是子进程对于父进程全局变量的影响,最后部分太复杂略过了,也许里面解释了我的问题。
    我遇到的问题在于 多线程执行之前对全局变量已经更改完毕,要把这个不再改动的全局变量在多线程里调用(只读)。
    大概唯一能解释的就是那句“ When you use multiprocessing to open a second process, an entirely new instance of Python, with its own global state, is created.”
    虽然这挺违反(我的)直觉的, Python 的机制真是奇怪。
    vmebeh
        5
    vmebeh  
       2015-10-02 02:05:29 +08:00
    多线程应该可行
    vmebeh
        6
    vmebeh  
       2015-10-02 02:12:47 +08:00
    多进程应该得用上进程间通信吧
    binux
        8
    binux  
       2015-10-02 02:26:49 +08:00   ❤️ 3
    windows 不继承父进程对全局变量的修改。这不是 python 机制的问题,这是操作系统的问题。
    http://stackoverflow.com/questions/6596617/python-multiprocess-diff-between-windows-and-linux
    引申一下,这个就是面试中经常问到的「工作中用不到的问题」,不遇到没事,遇到了,你根本不知道往哪个方向查。
    LPeJuN6lLsS9
        9
    LPeJuN6lLsS9  
       2015-10-02 09:36:19 +08:00
    @binux 你说的问题和主题很相关,但不是同一个问题。这里的问题是更基础的……另外#2 的代码在 windows 上根本就不能运行
    Exin
        10
    Exin  
    OP
       2015-10-02 11:46:30 +08:00
    @hantsuki 我是 Windows 环境的, Python 2.7.10 ,我自己这运行完了直接复制过来,应该是可以运行的
    Exin
        11
    Exin  
    OP
       2015-10-02 11:47:02 +08:00
    @hantsuki 哦复制后缩进没了……
    LPeJuN6lLsS9
        12
    LPeJuN6lLsS9  
       2015-10-02 14:19:41 +08:00
    @Exin 我错了,#9 没一句话是对的
    Exin
        13
    Exin  
    OP
       2015-10-02 15:24:58 +08:00
    @hantsuki Everyone makes mistakes. Never mind.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5387 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 06:12 · PVG 14:12 · LAX 23:12 · JFK 02:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.