线程与进程共享全局变量的区别及代码验证实例分析
[id_883531955[id_922603571]id_1145421362]

所以线程之间可以共享全局变量,因为共用一片空间
不同进程会使用不同的空间。因为使用的资源本质上是不同的,所以一片空间上的变量发生变化,不会对另一个空间的资源变化产生影响。
通过代码来对比2者的区别:
多线程实现:
import threading
import time
num = 100
def demo1():
global num
num += 100
print(f'demo1 中的 num 等于 num')
def demo2():
print(f“demo2 中的 num 等于具体的某个数”)
def main():
t1 = threading.Thread(target=demo1)
t2 = threading.Thread(target=demo2)
t1.start()
t2.start()
if __name__ == '__main__':
main()
运行结果:
----demo1—num=200
------demo2-----num=200
说明线程之间共享了该全局变量
进程代码:
import multiprocessing
import time
num = 100
lst = []
def main():
p1 = multiprocessing.Process(target=demo1)
p2 = multiprocessing.Process(target=demo2)
p1.start()
p2.start()
def demo1():
global num
num += 100
print(f'-----demo1----{num}')
lst.append(num)
print(lst)
#time.sleep(1)
def demo2():
time.sleep(1)
print(f'-----demo2----{num}')
print(lst)
if __name__ == '__main__':
main()
执行结果:
-----demo1----200
[200]
-----demo2----100
[]
从执行结果可以验证不同进程,全局变量是不可以共享的
在此我测试了列表和全局变量num
如何实现全局变量的进程共享呢?可以通过进程间交互的桥梁,也就是 multiprocess 的内置类 Quene 来实现。
import multiprocessing
from multiprocessing import Queue
def download(q):
lst = [1,2,3]
for i in lst:
q.put(i)
print('添加完毕')
def manage_data(q):
#将队列的元素取出来,存到新的列表中
man_data = list()
while True:
data = q.get()
man_data.append(data)
if q.empty():
break
print(man_data)
def main():
q = Queue()
p1 = multiprocessing.Process(target=download,args=(q,))
p2 = multiprocessing.Process(target=manage_data,args=(q,))
p1.start()
p2.start()
执行结果:
添加完毕
[1, 2, 3]