【Python 多核并行计算】

主要在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,那这台电脑一个核心可以执行多个任务,并且是一台可以超线程的电脑。

多个进程调用函数

下面的例子主要是用来了解一下进程调用函数的流程
下面的代码编译了几次感觉执行顺序都一样。

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)Pool.map()
2)Pool.startmap()
3)Pool.apply()
异步执行函数
1)Pool.map_async()
2)Pool.startmap_async()
3)Pool.apply_async()

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

适合用于分而治之
并行计算需要知道怎么使用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()

运行结果:
在这里插入图片描述

当遇到资源抢占的情况,使用锁是最好的方法。有个程序不用锁等了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()

输出结果:
在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值