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
模块提供的 Value
或 Array
来创建共享内存。下面的代码演示了如何使用共享内存来共享全局变量:
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 解释器中的全局变量。