一.进程相互通信
1.通信隔离
(1)多进程运算时的通信隔离
进行多进程运算,会产生多个不同空间的进程,因为每个空间都不互通,所以在子进程中的运算结果是不会传到主进程中,这就是通信隔离。
from multiprocessing import Process
var = 10
def fun():
global var
var += 1
print('fun 运算结果为:',var)
return var
# 新建一个子进程
p1 = Process(target=fun)
p1.start()
p1.join() # 子进程结束后再结束主进程
print('main 运算结果为:',var)
ssh://bd@127.0.0.1:1234/home/bd/.virtualenvs/py3env/bin/python3.6 -u /home/bd/py_case/day05/process_signal.py
fun 运算结果为: 11
main 运算结果为: 10
Process finished with exit code 0
(2)如何解决进程的通信隔离
为了解决通信隔离的问题,我们可以在子进程与主进程之间创建一个公共空间来进行主进程存放与主进程的计算,计算结束后再放回到公共空间中。(公共空间可以是列表,也可以是字典)
from multiprocessing import Process,Manager
# 导入一个寄存器,用来存放子进程与主进程的公用数据
mg = Manager() # 实例化一个服务器进程(管理器)
li_var = mg.list() # 在进程中开启一个列表空间,返回一个代理(公共的列表空间)
var = 10
def fun(li):
global var
var += 1
print('fun 运算结果为:',var)
li.append(var)
# return var
# 新建一个子进程
p1 = Process(target=fun,args=(li_var,))
p1.start()
p1.join() # 子进程结束后再结束主进程
# print('main 运算结果为:',var)
print('main 运算结果为',li_var[0])
ssh://bd@127.0.0.1:1234/home/bd/.virtualenvs/py3env/bin/python3.6 -u /home/bd/py_case/day05/process_signal.py
fun 运算结果为: 11
main 运算结果为 11
Process finished with exit code 0
2.线程共享
对于线程而言,它们始终在一个进程当中,因此共享同一个内存空间,因此可以访问主进程中的数据
(1)线程通信
from threading import Thread
var =