本文共 2604 字,大约阅读时间需要 8 分钟。
multiprocessing包是Python中用于多进程管理的核心库,与threading.Thread类似,但它利用多进程的方式运行更高效的任务。它支持通过multiprocessing.Process对象创建进程,类似于Thread,但功能更强大。Process对象提供start()、run()、join()等方法,与Thread类似,但运行的任务可以在Python程序内部编写的函数中执行。
multiprocessing包提供了高效的进程间通信机制,包括Pipe和Queue类。Pipe是单向或双向的通信通道,可以用于进程间传输数据。创建一个双向的Pipe实例,通过send()方法向一端发送数据,另一端的进程可以接收并读取数据。
例如:
import multiprocessing as muldef proc1(pipe): pipe.send('hello') print('proc1 rec:', pipe.recv())def proc2(pipe): print('proc2 rec:', pipe.recv()) pipe.send('hello, too')pipe = mul.Pipe()p1 = mul.Process(target=proc1, args=(pipe[0],))p2 = mul.Process(target=proc2, args=(pipe[1],))p1.start()p2.start()p1.join()p2.join() 运行结果:
proc2 rec: helloproc1 rec: hello, too
Queue则是一个先进先出的消息队列,支持多个进程同时读取和写入数据。Queue的创建方式类似于Pipe,可以指定最大存储容量。
进程池(Process Pool)允许我们同时启动多个进程来执行任务。通过Pool类,我们可以轻松管理多个进程,提高任务处理效率。
例如:
import multiprocessing as muldef f(x): return x ** 2if __name__ == '__main__': pool = mul.Pool(5) results = pool.map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) print(results)
运行结果:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
为了实现进程间的共享,multiprocessing包提供了共享内存的功能。我们可以通过Manager类创建共享的内存对象,如Value、Array、dict等。
例如:
import multiprocessingdef func1(a, arr): a.value = 3.14 for i in range(len(arr)): arr[i] = 0 a.value = 0if __name__ == '__main__': num = multiprocessing.Value('d', 1.0) arr = multiprocessing.Array('i', range(10)) p = multiprocessing.Process(target=func1, args=(num, arr)) p.start() p.join() print(num.value) print(arr[:]) 运行结果:
0.0[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Manager类用于共享资源。它支持多种共享数据类型,包括Value、Array、dict、list、Lock、Semaphore等。Manager可以帮助我们轻松地在多进程间共享数据。
例如:
from multiprocessing import Process, Managerdef func1(shareList, shareValue, shareDict, lock): with lock: shareValue.value += 1 shareDict[1] = '1' shareDict[2] = '2' for i in range(len(shareList)): shareList[i] += 1if __name__ == '__main__': manager = Manager() list1 = manager.list([1, 2, 3, 4, 5]) dict1 = manager.dict() array1 = manager.Array('i', range(10)) value1 = manager.Value('i', 1) lock = manager.Lock() processes = [Process(target=func1, args=(list1, value1, dict1, lock)) for _ in range(20)] for p in processes: p.start() for p in processes: p.join() print(list1) print(dict1) print(array1) print(value1) 运行结果:
[21, 22, 23, 24, 25]{1: '1', 2: '2'}array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])Value('i', 21) multiprocessing包为Python提供了强大的多进程管理功能,适用于需要高效并行处理任务的场景。通过合理使用Pipe、Queue、进程池、共享内存和Manager等功能,可以实现多进程之间的高效通信与资源共享。
转载地址:http://soafk.baihongyu.com/