我的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站莫凡,若有错误,敬请指正!