大家好!在本文中,我们将学习 Python 中的多进程multiprocessing。所以,让我们开始吧。
什么是多进程?
Multiprocessing 是 Python 中的一个包,它支持生成使用 Python API 的进程的能力。它类似于 Python 中的线程模块。
理解 Python 中的多进程
多处理器是一台计算机,意味着该计算机具有多个中央处理器。如果一台计算机只有一个多核处理器,则可以使用Python 中的多线程并行运行任务。
多处理器系统能够同时支持多个处理器。要查找我们系统上可用的 CPU 内核数,我们使用mp.cpu_count() 函数。
在本文中,我们将使用 Python 的多处理模块
这是使用 multiprocessing 模块在 Python 中查找处理器计数的示例代码:
import multiprocessing as mp
print (mp.cpu_count())
|
输出:12
这里的计数是多个处理器之间的内核总数,总和。
该模块的四个最重要的类是-
- 进程类
- 锁类
- 队列类
- 泳池课
让我们分别看一下这些类中的每一个……
1.进程类
进程是当前进程的分叉副本。它创建一个新的进程标识符,任务作为独立的子进程运行。
start()和join()函数属于这个类。要通过进程传递参数,我们使用args关键字。
start() 函数示例-
在这里,我们创建了一个函数calc_square和calc_cube 分别用于查找数字的平方和立方。在 main 函数中,我们创建了对象p1和p2。p1.start()和p2.start()将启动函数并调用p1.join() 和 p2.join将终止进程。
import time
import multiprocessing
def calc_square(numbers):
for n in numbers:
print ( 'square ' + str (n * n))
def calc_cube(numbers):
for n in numbers:
print ( 'cube ' + str (n * n * n))
if __name__ = = "__main__" :
arr = [ 2 , 3 , 8 , 9 ]
p1 = multiprocessing.Process(target = calc_square,args = (arr,))
p2 = multiprocessing.Process(target = calc_cube,args = (arr,))
p1.start()
p2.start()
p1.join()
p2.join()
print ( "Done" )
|
Output:
square 4
square 9
square 64
square 81
cube 8
cube 27
cube 512
cube 729
Done
|
2. 锁类
lock 类允许锁定代码,以确保在释放之前没有其他进程可以执行类似的代码。
要声明锁,使用acquire()函数,释放锁,使用release()函数。
from multiprocessing import Process, Lock
lock = Lock()
def printer(data):
lock.acquire()
try :
print (data)
finally :
lock.release()
if __name__ = = "__main__" :
items = [ 'mobile' , 'computer' , 'tablet' ]
for item in items:
p = Process(target = printer,args = (item,))
p.start()
|
输出
mobile
computer
tablet
|
3. 队列类
队列是一种使用先进先出 (FIFO) 技术的数据结构。它帮助我们使用原生 Python 对象执行进程间通信。
队列使进程能够在作为参数传递时使用共享数据。
put()函数用于向队列中插入数据, get()函数用于消费队列中的数据。
import multiprocessing as mp
def sqr(x,q):
q.put(x * x)
if __name__ = = "__main__" :
q = mp.Queue() # Instance of queue class created
processes = [mp.Process(target = sqr,args = (i,q)) for i in range ( 2 , 10 )] # List of processes within range 2 to 10
for p in processes:
p.start()
for p in processes:
p.join()
result = [q.get() for p in processes]
print (result)
|
输出:
[ 4 , 9 , 16 , 25 , 36 , 64 , 49 , 81 ]
|
4. 泳池课
pool 类帮助我们针对多个输入值并行执行一个函数。这个概念称为数据并行。
这里,数组 [5,9,8] 被映射为函数调用中的输入。pool.map() 函数用于传递多个参数的列表。
import multiprocessing as mp
def my_func(x):
print (x * * x)
def main():
pool = mp.Pool(mp.cpu_count())
result = pool. map (my_func, [ 5 , 9 , 8 ])
if __name__ = = "__main__" :
main()
|
输出:
3125
387420489
16777216
|
结论
在本文中,我们学习了 Python 多处理中最重要的四个类——进程、锁、队列和池,它们可以更好地利用 CPU 内核并提高性能。