马云|多进程间的全局变量共享吗?一道问题引出了16+面试题,你都会吗

马云|多进程间的全局变量共享吗?一道问题引出了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() 可以停下当前的进程 , 让其他进程开始工作
而这只是一个单纯的进程变量的共享问题 , 要不是正好小祖宗遇到了 , 可能我都不会想到这个问题 , 下面是我整理的关于多线程的一些相关的知识

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

【马云|多进程间的全局变量共享吗?一道问题引出了16+面试题,你都会吗】最后:东西在我手里是我自己的 , 东西你不自己去整理也还都是我的 , 希望大家有需要的 , 可以关注+转发后 , 私信“资料”查看获取方式 , 然后把这张图转成自己的东西


    推荐阅读