一、案例1,定义全局变量测试
from multiprocessing import Process
x = 0 # 定义全局变量x
def my_task():
global x
x = x + 1
print(f'子进程x={x}')
if __name__ == '__main__':
p1 = Process(target=my_task)
p1.start()
p1.join()
print(f'主进程x={x}')
D:\pyproject\pythonProject\.venv\Scripts\python.exe D:\pyproject\pythonProject\test4.py
子进程x=1
主进程x=0
结论:进程之间无法通信,每个进程享有独立的内存,只是在子进程内对x计算,没有反馈到主进程
二、 案例2,通过共享内存来共享变量
from multiprocessing import Process, Value
import time
def my_task(num):
time.sleep(1) # 暂停1秒
num.value += 1 # 在进程中修改num值
print(f'子进程num.value={num.value}')
if __name__ == '__main__':
num = Value('i', 9) # i 代表是整数类型,f 代表是浮点数类型, 共享内存 Value
p1 = Process(target=my_task, args=(num,))
p1.start()
p1.join() # 等待p1子进程完成后,再进行主进程
print(f'主进程num.value={num.value}')
整数类型 num = Value('i', 9) 的输出结果
D:\pyproject\pythonProject\.venv\Scripts\python.exe D:\pyproject\pythonProject\test4.py
子进程num.value=10
主进程num.value=10
浮点数num = Value('i', 9)的输出结果
D:\pyproject\pythonProject\.venv\Scripts\python.exe D:\pyproject\pythonProject\test4.py
子进程num.value=10.0
主进程num.value=10.0
# !!!注释掉p1.join(), 此时主进程先执行完毕,子进程由于暂停了1秒,所以后执行完毕
from multiprocessing import Process, Value
import time
def my_task(num):
time.sleep(1) # 暂停1秒
num.value += 1 # 在进程中修改num值
print(f'子进程num.value={num.value}')
if __name__ == '__main__':
num = Value('i', 9) # 共享内存 Value
p1 = Process(target=my_task, args=(num,))
p1.start()
# p1.join() # 等待子进程完成后,再进行主进程, 注释掉此行,主程序不会等待,继续往下执行
print(f'主进程num.value={num.value}')
D:\pyproject\pythonProject\.venv\Scripts\python.exe D:\pyproject\pythonProject\test4.py
主进程num.value=9
子进程num.value=10
结果发现:主程序先输出,即先执行完毕,子程序由于sleep1秒,所以后执行完毕,主程序num未更新