python多进程 主进程和子进程间共享和不共享全局

1. 什么是多进程?

在计算机系统中,进程是指正在执行中的程序实例。每个进程都会有一些特定的内存空间和 CPU 时间来执行它的程序。多进程就是在同一个程序内启动多个进程,各自运行各自的任务,从而提高计算机系统的效率。Python 提供了 multiprocessing 模块来支持多进程编程。

2. 主进程和子进程间的全局变量

2.1 全局变量不共享

在多进程中,主进程和子进程是各自独立的进程,它们有各自的内存空间。因此,它们的全局变量是不共享的。下面的代码演示了在主进程和子进程中修改同一个全局变量不会互相影响:

from multiprocessing import Process

import time

temperature = 0

def set_temperature(t):

global temperature

temperature = t

print(f"Set temperature to {temperature}")

def get_temperature():

global temperature

print(f"The temperature now is {temperature}")

if __name__ == '__main__':

print(f"In the main process, the temperature is {temperature}")

p = Process(target=set_temperature, args=(30,))

p.start()

p.join()

print(f"In the main process, the temperature is still {temperature}")

输出结果如下:

In the main process, the temperature is 0

Set temperature to 30

In the main process, the temperature is still 0

可以看到,主进程在运行时输出全局变量 temperature 的值是 0,然后启动了一个子进程,让它修改 temperature 的值为 30,修改成功后输出了修改后的值。最后主进程输出全局变量的值仍然是 0。

2.2 共享全局变量

如果要实现主进程和子进程间共享全局变量,需要使用 multiprocessing 模块提供的 ValueArray 来创建共享内存。下面的代码演示了如何使用共享内存来共享全局变量:

from multiprocessing import Process, Value

import time

temperature = Value('d', 0)

def set_temperature(t):

temperature.value = t

print(f"Set temperature to {temperature.value}")

def get_temperature():

print(f"The temperature now is {temperature.value}")

if __name__ == '__main__':

print(f"In the main process, the temperature is {temperature.value}")

p = Process(target=set_temperature, args=(30,))

p.start()

p.join()

get_temperature()

输出结果如下:

In the main process, the temperature is 0

Set temperature to 30

The temperature now is 30

可以看到,在共享内存中创建的全局变量 temperature 的值被成功修改,并且可以在主进程和子进程中共享。

3. 总结

本文介绍了 Python 中多进程编程的基本概念和使用方法,着重讲解了主进程和子进程间的全局变量如何共享和不共享的问题。需要注意的是,在主进程和子进程间共享全局变量时,需要使用 multiprocessing 模块提供的共享内存,而不是直接操作 Python 解释器中的全局变量。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签