前言
在Python中,进程(Process)是独立运行的程序实例,每个进程有自己独立的内存空间、文件描述符等资源。Python提供了multiprocessing模块用于多进程编程,可以方便地创建和管理进程。
什么是进程(Process)
进程是操作系统分配资源和调度的基本单位。每个进程都有自己的内存空间,独立运行,并且无法直接与其他进程共享内存。进程的优点是稳定性高,一个进程的崩溃不会影响其他进程。缺点是进程间通信(IPC)比较复杂,且创建和切换进程的开销较大。我们电脑中每一个独立的应用,都是一个进程。
进程使用
在Python中,进程使用multiprocessing模块
import multiprocessing
import time
def worker(num):
"""进程的工作函数"""
time.sleep(5)
print(f'进程: {num}')
if __name__ == '__main__':
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
jobs.append(p)
p.start()
进程间通信
在Python中,进程间通信可以是使用Queue
、Pipe
等方式,当然也可以直接使用socket,这里简单看一下Python提供的通信模块
from multiprocessing import Process, Queue
def worker(q,i):
q.put(f'process:{i}')
if __name__ == '__main__':
q = Queue()
for i in range(10):
p = Process(target=worker, args=(q,i))
p.start()
p.join()
while q.qsize() > 0 :
print(q.get()) # 从队列中获取数据
进程池
一般情况下,推荐使用进程池来处理多进程任务,可以有效避免资源泄漏和性能问题。Python使用multiprocessing.Pool
可以方便地管理多个进程
from multiprocessing import Pool
def square(x):
return x * x
if __name__ == '__main__':
with Pool(4) as p:
results = p.map(square, [1, 2, 3, 4])
print(results)
进程池的基本使用很简单,相当于提前创建一批进程,之后的所有任务都有这些进程来完成,直至进程池释放,可以理解为用空间来换时间,不用频繁进行创建和终止进程操作。
进程共享数据
Python提供了Value
,Array
模块可以在进程间共享数据
from multiprocessing import Process, Value, Array
def worker(num, arr):
num.value = 3.14159
for i in range(len(arr)):
arr[i] = arr[i] * 2
if __name__ == '__main__':
num = Value('d', 0.0)
arr = Array('i', range(5))
p = Process(target=worker, args=(num, arr))
p.start()
p.join()
print(num.value)
print(arr[:])
如果对进程不是很熟悉的话,进程间数据共享和通信问题,只看代码很难理解的,可以自己动手取调试一下,更能促进对进程的理解,我个人也是花了很长时间,才理解进程和线程在我们编码中的实际区别。
总结
牢记一点,进程是资源平台,是操作系统进行资源分配和调度的基本单位,进程的详细定义和理解,可以自己查一下资料,这里只对Python中进程的使用做一个简单的介绍