优秀的编程知识分享平台

网站首页 > 技术文章 正文

Python多进程编程之共享变量-1(python 进程共享变量)

nanyue 2024-08-18 19:58:18 技术文章 7 ℃

一、案例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未更新

Tags:

最近发表
标签列表