一、global关键字:
在函数中定义的变量如果加上global关键字,则表示要声明修改全局变量的内存地址。
二、原因:
创建的子进程会对主进程的资源进行拷贝。创建的子进程实际上就是主进程的一个副本。
(资源包含:代码、分配的内
存等)
三、进程之间不共享全局变量——未调用join方法
from multiprocessing import Process from time import * g_list = list() # 定义全局变量 def add_data(): """添加数据任务""" for i in range(3): """ 列表是可变类型,可以在原有的内存基础上修改数据,且修改后内存地址不变, 所以不需要加上global关键字。 """ g_list.append(i) print("add:", i) sleep(0.2) print("添加的数据为:", g_list) def read_data(): """读取数据任务""" print("read",g_list) p1 = Process(target=add_data) p2 = Process(target=read_data) p1.start() p2.start()
执行结果:
四、进程之间不共享全局变量——调用join方法
from multiprocessing import Process from time import * g_list = list() # 定义全局变量 def add_data(): """添加数据任务""" for i in range(3): """ 列表是可变类型,可以在原有的内存基础上修改数据,且修改后内存地址不变, 所以不需要加上global关键字。 """ g_list.append(i) print("add:", i) sleep(0.2) print("添加的数据为:", g_list) def read_data(): """读取数据任务""" print("read",g_list) p1 = Process(target=add_data) p2 = Process(target=read_data) p1.start() p1.join() # 表示主进程等待p1子进程添加完数据后再继续往下执行 p2.start()
执行结果:
五、Windows系统的BUG
1、问题:此BUG只会发生在Windows系统中。即:创建子进程后,子进程除了会拷贝主进程的代码外,还会拷贝主进程的执行代码。从而导致了无限递归的错误。
2、解决:
通过判断主否为主模块来解决此BUG。
if __name__ == '__main__':
pass
3、if__name__ == '__main__':的两大作用:
防止别人导入你的模块
防止创建子进程后,子进程会拷贝主进程的代码外,还会拷贝主进程的执行代码,导致无限递归创建子进程错误
Windows中多进程Bug演示:
from multiprocessing import * from time import * g_list = list() # 定义全局变量 def add_data(): """添加数据任务""" for i in range(3): g_list.append(i) print("add:", i) sleep(0.2) print("添加的数据为:", g_list) def read_data(): """读取数据任务""" print("read", g_list) if __name__ == "__main__": p1 = Process(target=add_data) # 创建添加数据子进程 p2 = Process(target=read_data) # 创建读取数据子进程 p1.start() p1.join() p2.start()