python学习笔记(七)

我的python学习之路

multiprocessing多进程多核运算

正常python都是进行单核运算,这里引进多核运算,为解决多进程的劣势,引入多核运算

创建多进程

import multiprocessing as mp
import threading as td
def job(a,b)
print(“…”)
#t1=td.Thread(target=job,args=(1,2))
p1=mp.Process(target=job,args=(1,2))
#ti.start()
p1=start()
#t1.join()
p1.join()

queue功能

每个进程的运算结果放在队列里中, 等到每个线程或核运行完毕后再从队列中取出结果,一个一个返回某一进程的值,继续加载运算。
import multiprocessing as mp

def job(q):
res=0
for i in range(1000):
res+=i+i2+i3
q.put(res) #queue

if name==‘main’:
q = mp.Queue()
p1 = mp.Process(target=job,args=(q,))#创建一个进程p1,记得写逗号
p2 = mp.Process(target=job,args=(q,))
p1.start()
p2.start()
p1.join()
p2.join()
res1 = q.get()#第一次输出
res2 = q.get()#第二次输出
print(res1+res2)

效率对比多核与多线程

import multiprocessing as mp
import threading as td
import time

def job(q):
res = 0
for i in range(1000000):
res += i + i2 + i3
q.put(res) # queue
def multicore():
q = mp.Queue()
p1 = mp.Process(target=job, args=(q,))
p2 = mp.Process(target=job, args=(q,))
p1.start()
p2.start()
p1.join()
p2.join()
res1 = q.get()
res2 = q.get()
print(‘multicore:’,res1 + res2)

def multithread():
q = mp.Queue() # thread可放入process同样的queue中
t1 = td.Thread(target=job, args=(q,))
t2 = td.Thread(target=job, args=(q,))
t1.start()
t2.start()
t1.join()
t2.join()
res1 = q.get()
res2 = q.get()
print(‘multithread:’, res1 + res2)

def normal():
res = 0
for _ in range(2):
for i in range(1000000):
res += i + i2 + i3
print(‘normal:’, res)

if name == ‘main’:
st = time.time()#计算时间
normal()
st1 = time.time()
print(‘normal time:’, st1 - st)
multithread()
st2 = time.time()
print(‘multithread time:’, st2 - st1)
multicore()
print(‘multicore time:’, time.time() - st2)

进程池pool

进程池:将所要运行的东西,放到进程池里,Python会进行进程任务的分配相关的工作
pool = mp.Pool()
在pool里面func可以有返回值return
def multicore():
pool = mp.Pool()#默认为全部的核
res = pool.map(job, range(10))
print(res)
在map()中放入函数和需要运算的值,然后它会自动分配给CPU核,返回结果

apply_async()中只能传递一个值,它只会放入一个核进行运算,在传入值后需要加逗号, 用get()方法获取返回值
def multicore():
pool = mp.Pool()
res = pool.map(job, range(10))
print(res)
res = pool.apply_async(job, (2,))#只能输入一个值
print(res.get())

当需要获得多个值时可以用
multi_res = [pool.apply_async(job, (i,)) for i in range(10)]
print([res.get() for res in multi_res])

共享内存

使用Value数据存储在一个共享的内存表中。
import multiprocessing as mp
value1 = mp.Value(‘i’, 0)
value2 = mp.Value(‘d’, 3.14)
​其中d和i参数用来设置数据类型的,d表示一个双精浮点类型,i表示一个带符号的整型。
还有一个Array类,可以和共享内存交互,来实现在进程之间共享数据。
array = mp.Array(‘i’, [1, 2, 3, 4])
Array只能是一维的,不能是多维的,且需定义数据形式。

多进程进程锁

共享内存就是对于一个全局变量,不能直接在多进程之间被调用,只能设置一个共享内存存储某一类型的变量并设置初始值,例如
v=mp.Value(‘i’,0)#int型且初始值为0
因此要引入锁
l=mp.Lock()
l.acquire()
l.release()

以上内容均来自b站莫凡,若有错误,敬请指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值