Python中的多进程multiprocessing

本文详细介绍了Python的multiprocessing模块,涵盖进程类、锁、队列和Pool类的使用,教你如何利用多处理器提升性能。通过实例演示了如何创建进程、使用锁同步和队列通信,以及如何利用Pool实现并行计算。
摘要由CSDN通过智能技术生成

大家好!在本文中,我们将学习 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_squarecalc_cube 分别用于查找数字的平方和立方。在 main 函数中,我们创建了对象p1p2p1.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 内核并提高性能。

参考

官方模块文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值