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

2015-10-02 01:00:44 +08:00
 Exin
写了个 Python 小程序,
有一处出现了某个全局变量“不能修改”的情况,
更甚者,一个函数里的一个变量直接 print 和 return 这个变量之后再 print 结果不一样的情况,
排了俩小时我快疯了
1771 次点击
所在节点    问与答
13 条回复
Sylv
2015-10-02 01:19:29 +08:00
请先上代码
Exin
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
2015-10-02 01:35:27 +08:00
Exin
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
2015-10-02 02:05:29 +08:00
多线程应该可行
vmebeh
2015-10-02 02:12:47 +08:00
多进程应该得用上进程间通信吧
vmebeh
2015-10-02 02:23:39 +08:00
binux
2015-10-02 02:26:49 +08:00
windows 不继承父进程对全局变量的修改。这不是 python 机制的问题,这是操作系统的问题。
http://stackoverflow.com/questions/6596617/python-multiprocess-diff-between-windows-and-linux
引申一下,这个就是面试中经常问到的「工作中用不到的问题」,不遇到没事,遇到了,你根本不知道往哪个方向查。
LPeJuN6lLsS9
2015-10-02 09:36:19 +08:00
@binux 你说的问题和主题很相关,但不是同一个问题。这里的问题是更基础的……另外#2 的代码在 windows 上根本就不能运行
Exin
2015-10-02 11:46:30 +08:00
@hantsuki 我是 Windows 环境的, Python 2.7.10 ,我自己这运行完了直接复制过来,应该是可以运行的
Exin
2015-10-02 11:47:02 +08:00
@hantsuki 哦复制后缩进没了……
LPeJuN6lLsS9
2015-10-02 14:19:41 +08:00
@Exin 我错了,#9 没一句话是对的
Exin
2015-10-02 15:24:58 +08:00
@hantsuki Everyone makes mistakes. Never mind.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/225154

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX