vs查看全局变量实时运行值_多进程间的全局变量共享吗?一道问题引出了16+面试题,你都会吗...

前言

最近多线程与高并发的知识点真的是相当的火呀,这不,刚刚家里的小祖宗(比我小一辈的孩子,但是岁数没差多少)在面试的时候就碰壁了,不过幸好的是他作为应届生,应该拿offer问题不大,让他碰壁的就一个问题:多进程间的全局变量共享吗?

其实是很简单的一个话题,不过,这小伙子可能当时紧张了,就没回答出来多少内容,最后抱歉的跟面试官其他的忘记了

哈哈哈哈,话不多说,直接看代码吧,这种直观的展现是我比较喜欢的

import multiprocessing as mul_p
import time
egg1 = 1
def write(egg2, q):
global egg1
print("write全局变量彩蛋[%s]..." % egg1)
print("write彩蛋[%s]..." % egg2)
egg1 -= 1
print("write全局变量彩蛋[%s]...原来的彩蛋[1]" % egg1)
# 将修改后的彩蛋1的值放入队列中去
q.put(egg1)
def read(egg2, q):
global egg1
print("read全局变量彩蛋[%s]..." % egg1)
print("read彩蛋[%s]..." % egg2)
while True:
# 从队列中取出 p1 子进程中的 全局变量彩蛋1 的值
egg1 = q.get()
print("read接收到的write中的全局变量彩蛋[1]的值:%d" % egg1)
if q.empty():
print("接收完毕...")
break
def main():
# 假设连个进程都需要打印下面这个彩蛋2
egg2 = 2
# ① 创建一个队列,可以不填,队列就可以很大,但有个极限,我们不去考虑它
# 如果填了数字为 x ,则这个队列可以存储 x 个数据
q = mul_p.Queue()
# ② 创建两个进程对象
p1 = mul_p.Process(target=write, args=(egg2, q,))
p2 = mul_p.Process(target=read, args=(egg2, q,))
# ③ 让两个子进程开始工作
p1.start()
# 先让主进程 休息1s 让 p1 子进程先执行完,不然两个子进程 争着执行 打印输出会乱套
time.sleep(1)
p2.start()
if __name__ == "__main__":
main()

运行结果:

write全局变量彩蛋[1]...
write彩蛋[2]...
write全局变量彩蛋[0]...原来的彩蛋[1]
read全局变量彩蛋[1]...
read彩蛋[2]...
read接收到的write中的全局变量彩蛋[1]的值:0
接收完毕...

怎么样,这样来看,是不是就很好理解了,这也是为什么我之前的文章都会说一句,要多写代码的原因,写的多了,里面有一些知识点自然而然的就学会了,当然了,闷头敲代码肯定也是不行的,也要注意总结,来吧,总结

二、总结

  • ① 各个进程间全局变量的值是 不共享 

    ※:这是因为每创建一个进程就会 copy 一份原始代码(全局变量还是初值)给自己使用,所以进程间的代码是一样的,但 变量和数据是独立 的

  • ② 各个进程间可以通过 Queue 创建的队列来传递变量,列表,字符串值(包括全局变量的值)

  • ③ 每个进程任务里的参数,除了 全局变量(函数局部变量),其余的参数都需要通过外部实参,传入到内部形参。※:尤其是上例程的 队列 q 要作为 实参传给两个进程,这样才能实现两个进程间的通信。

  • ③ 进程与线程之间的关系与区别:① 进程 包含 多个线程② 进程间 不共用 变量与资源;线程间 共用 变量与资源③ 使用 time.sleep() ,可以停下当前的进程,让其他进程开始工作


而这只是一个单纯的进程变量的共享问题,要不是正好小祖宗遇到了,可能我都不会想到这个问题,下面是我整理的关于多线程的一些相关的知识

26d464faa76187c519a58868b48e7398.png

内容包括:

主要是通过一些面试题讲解一些知识点,我个人觉得,带着目的的去学习是一件挺刺激的事情,遇见问题解决问题,要的就是解决问题的成就感,希望能对大家有所帮助

2511eaf04d54e28d4744b0aac737427f.png

最后:东西在我手里是我自己的,东西你不自己去整理也还都是我的,在获取到知识图谱系列之后,把图里面的内容转成自己的东西

获取相应知识资料,直接添加小助手:msbxq2020即可

86b3d2f5300701e85139539198ba38e4.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值