1
Sylv 2015-10-02 01:19:29 +08:00 via iPhone
请先上代码
|
2
Exin OP @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 有一份全局变量的原始备份, 在它被调用之前即使更改了全局变量的值,它也不更新 |
3
Sylv 2015-10-02 01:35:27 +08:00 via iPhone
|
4
Exin OP @Sylv 我也看过这个页面了,这里谈到的似乎是子进程对于父进程全局变量的影响,最后部分太复杂略过了,也许里面解释了我的问题。
我遇到的问题在于 多线程执行之前对全局变量已经更改完毕,要把这个不再改动的全局变量在多线程里调用(只读)。 大概唯一能解释的就是那句“ When you use multiprocessing to open a second process, an entirely new instance of Python, with its own global state, is created.” 虽然这挺违反(我的)直觉的, Python 的机制真是奇怪。 |
5
vmebeh 2015-10-02 02:05:29 +08:00
多线程应该可行
|
6
vmebeh 2015-10-02 02:12:47 +08:00
多进程应该得用上进程间通信吧
|
7
vmebeh 2015-10-02 02:23:39 +08:00
|
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 引申一下,这个就是面试中经常问到的「工作中用不到的问题」,不遇到没事,遇到了,你根本不知道往哪个方向查。 |
9
LPeJuN6lLsS9 2015-10-02 09:36:19 +08:00
@binux 你说的问题和主题很相关,但不是同一个问题。这里的问题是更基础的……另外#2 的代码在 windows 上根本就不能运行
|
10
Exin OP @hantsuki 我是 Windows 环境的, Python 2.7.10 ,我自己这运行完了直接复制过来,应该是可以运行的
|
12
LPeJuN6lLsS9 2015-10-02 14:19:41 +08:00
@Exin 我错了,#9 没一句话是对的
|