当前位置: 主页 > Python语言

python 多核并行计算-python 多线程并行

发布时间:2023-02-13 07:03   浏览次数:次   作者:佚名

WIN系统下主要实现:

首先查看你电脑的实际核心数:

在cmd.exe中输入wmic,然后输入cpu ge NumberOfCores即可读取系统核心数。

在这里插入图片描述

使用 Python 代码检查核心数

import multiprocessing as mp
import math
if __name__ == '__main__':
  numOfCore = int(mp.cpu_count())
  print(str(numOfCore))

计算机上输出的不是6核,而是12核。那么这台计算机一个核就可以执行多项任务,是一台可以超线程的计算机。

多个进程调用

下面的例子主要是用来理解进程调用函数的过程

下面的代码编译了几次python 多核并行计算,感觉执行顺序是一样的。

import multiprocessing as mp
def  working(i):
   print('Working process:%s' %i)
if __name__ == '__main__':
  ProcessWorker = []
  for i in range(12):
     p = mp.Process(target=working,args=(i,))
     ProcessWorker.append(p)
     p.start()
     p.join()

输出结果:

在这里插入图片描述

换成另一种形式,很明显有些进程会先执行代码

import multiprocessing as mp
def  working(i):
   print('Working process:%s' %i)
if __name__ == '__main__':
  ProcessWorker = []
  for i in range(12):
     p = mp.Process(target=working,args=(i,))
     ProcessWorker.append(p)
     p.start()
  for i in range(12):
     p.join()

输出结果

在这里插入图片描述

使用 Pool 类的并行计算

Pool类可分为同步和异步

同步执行函数

1)游泳池。 地图()

2)游泳池。 启动图()

3)游泳池。 申请()

异步执行函数

1)游泳池。 地图异步()

2)游泳池。 startmap_async()

3)游泳池。 应用异步()

import multiprocessing as mp
import math
def  calculate(r):
   return r*r*math.pi
if __name__ == '__main__':
  with mp.Pool(8) as p:
      print(p.map(calculate,[1,3,5,7,9]))
  p.close();

运算结果

在这里插入图片描述

映射和减少

适合分而治之

并行计算需要知道如何使用map和reduce

import multiprocessing as mp
from functools import reduce
import math
def sum(x,y):
    return x+y;
def  calculate(r):
   return r*r*math.pi
if __name__ == '__main__':
  with mp.Pool(8) as p:
      result=(p.map(calculate,[1,3,5,7,9]))
  p.close();
  result1 = reduce(sum,list(result))
  result2 = reduce(lambda x,y:x+y,list(result))
  print(result1)
  print(result2)

运行结果:

在这里插入图片描述

过程信息交换

使用队列Queue进行信息交互。 注意这个Queue是Manager下的Queue。 如果不能运行,就是方法不对。

from multiprocessing import Process,Lock,Pool,Manager
def put(value,q):
    q.put(value)
    print('put %s' % value)
def get(q):
    while True:
        if not q.empty():
          value = q.get()
          print('get %s' % value)
        else:
          break
if __name__=='__main__':
    m = Manager()
    q = m.Queue()
    pool = Pool(processes=6)
    for num in range(6):
      pool.apply_async(put,(num,q,))
    pool.close()
    pool.join()
    pget = Process(target=get,args=(q,))
    pget.start()
    pget.join()

运行结果:

在这里插入图片描述

当遇到资源抢占时python 多核并行计算,使用锁是最好的方式。 有一个程序不需要加锁等待2分钟才执行。 加了锁后,需要排队等待资源,效率更高。

from multiprocessing import Process,Lock,Pool,Manager
lock = Lock()
def put(value,q):
    lock.acquire()
    q.put(value)
    print('put %s' % value)
    lock.release()
def get(q):
    while True:
        if not q.empty():
          value = q.get()
          print('get %s' % value)
        else:
          break
if __name__=='__main__':
    m = Manager()
    q = m.Queue()
    pool = Pool(processes=6)
    for num in range(6):
      pool.apply_async(put,(num,q,))
    pool.close()
    pool.join()
    pget = Process(target=get,args=(q,))
    pget.start()
    pget.join()

输出结果:

在这里插入图片描述