目录
一、什么是多进程
二、创建进程
三、queue进程输出
四、效率对比 multithreading,multiprocessing
五、进程池 pool
六、共享内存 shared memory
七、lock 锁
额外补充,pickle 存放数据
一、什么是多进程
多核运算介绍:计算机多个核同时处理多个线程。
二、创建进程
代码如下,
import multiprocessing as mp
#import threading as td
def job(a,d):
print('aaa')
if __name__=='__main__':
#t1=td.Thread(target=job,args=(1,2))
p1=mp.Process(target=job,args=(1,2))
#t1.start()
p1.start()
#t1,join()
p1.join()
三、queue进程输出
代码如下,
import multiprocessing as mp
#import threading as td
def job(q):
res=0
for i in range(1000):
res+=i+i**2+i**3
q.put(res)#queue
if __name__=='__main__':#要在这个框架完成
q=mp.Queue()
p1=mp.Process(target=job,args=(q,))#q后面的“,”不能省略,表示它可以叠代
p2=mp.Process(target=job,args=(q,))
p1.start()
p2.start()
p1.join()#jion阻塞队列,全部运行完成后退出
p2.join()
res1=q.get()
res2=q.get()
print(res1+res2)
输出结果
========================= RESTART: D:\Python exercise\test905.py ========================
499667166000
四、效率对比 multithreading,multiprocessing
代码如下,
import multiprocessing as mp
import threading as td
import time
def job(q):
res=0
for i in range(10000000):
res+=i+i**2+i**3
q.put(res)#queue
def multicore():
q=mp.Queue()
p1=mp.Process(target=job,args=(q,))#q后面的“,”不能省略,表示它可以叠代
p2=mp.Process(target=job,args=(q,))
p1.start()
p2.start()
p1.join()#jion阻塞队列,全部运行完成后退出
p2.join()
res1=q.get()
res2=q.get()
print(res1+res2)
def normal():
res=0
for _ in range(2):
for i in range(10000000):
res+=i+i**2+i**3
print('narmal:',res)
def multithread():
q=mp.Queue()
t1=td.Thread(target=job,args=(q,))#q后面的“,”不能省略,表示它可以叠代
t2=td.Thread(target=job,args=(q,))
t1.start()
t2.start()
t1.join()#jion阻塞队列,全部运行完成后退出
t2.join()
res1=q.get()
res2=q.get()
print('multithread:',res1+res2)
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)
运行结果,multiprocessing>multicore>normal,range()里面的数越大,结果明显。
========================= RESTART: D:\Python exercise\test905.py ========================
narmal: 4999999666666716666660000000
normal time: 9.571225881576538
multithread: 4999999666666716666660000000
multithread time: 9.488673448562622
4999999666666716666660000000
multicore time: 5.556674957275391
五、进程池 pool
把所有要运行的程序放到一个池子里,python帮助怎么分配这些进程和运行的结果。
代码如下,
import multiprocessing as mp
def job(x):
return x*x
def multicore():
pool=mp.Pool()#注意Pool中的P要大写
res=pool.map(job,range(10))#注意这一行里面是map
print(res)
if __name__=='__main__':
multicore()
?运行结果,
========================= RESTART: D:\Python exercise\test905.py ========================
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
?其他不同的程序写法
import multiprocessing as mp
def job(x):
return x*x
def multicore():
pool=mp.Pool(processes=3)#注意processes=3,表示用到三个核,默认的值是全部的核
res=pool.map(job,range(10))#注意这一行里面是map
print(res)
res=pool.apply_async(job,(2,))#2后面的“,”不能少
print(res.get())
multi_res=[pool.apply_async(job,(i,))for i in range(10)]
print([res.get() for res in multi_res])
if __name__=='__main__':
multicore()
运行结果,
========================= RESTART: D:\Python exercise\test905.py ========================
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
4
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
六、共享内存 shared memory
import multiprocessing as mp
value=mp.Value('d',1)#注意i-整数,d-小数,再传入一个数值
array=mp.Array('i',[1,2,3])#注意array是一维的,是一条数据线
具体的应用后续补充
七、lock 锁
?md,这破程序为啥运行了没啥反应呢!!!!
import multiprocessing as mp
import time
def job(v,num,l):
l.acquire()#表示锁住它
for _ in range(10):
time.sleep(0.1)#表示暂停,暂停一下效果比较明显
v.value+=num
print(v.value)
l.release()
def multicore():
l=mp.Lock()
v=mp.Value('i',0)
p1=mp.Process(target=job,args=(v,1,l))#q后面的“,”不能省略,表示它可以叠代
p2=mp.Process(target=job,args=(v,3,l))
p1.start()
p2.start()
p1.join()#jion阻塞队列,全部运行完成后退出
p2.join()
if __name__=='__main__':#要在这个框架完成
multicore()
额外补充,pickle 存放数据
代码如下,
import pickle
a_dict={'da':111,2:[23,1,4],'24':{1:2,'d':'sad'}}
##file=open('pickle_example.pickle','wb')
##pickle.dump(a_dict,file)
##file.close()
##file=open('pickle_example.pickle','rb')
##a_dict1=pickle.load(file)
##file.close()
##print(a_dict1)
with open('pickle_example.pickle','rb')as file:
a_dict1=pickle.load(file)
print(a_dict1)
运行结果,
========================= RESTART: D:\Python exercise\test905.py ========================
{'da': 111, 2: [23, 1, 4], '24': {1: 2, 'd': 'sad'}}
>>>
========================= RESTART: D:\Python exercise\test905.py ========================
{'da': 111, 2: [23, 1, 4], '24': {1: 2, 'd': 'sad'}}
>>>
至此,已经讲完了多进程。
|