如题。
运行条件 多进程,必须得有
if __name__ == '__main__':
否则会报错。
1 2 3 4 5 6 7 8 9 10 11 import multiprocessing as mpdef job (a,d) : print("aaaaaa" ) if __name__ == '__main__' : p1 = mp.Process(target=job,args=(1 ,2 )) p1.start() p1.join()
queue进程输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import multiprocessing as mpdef job (q) : res=0 for i in range(1000 ): res+=i+i**2 +i**3 q.put(res) if __name__=='__main__' : 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(res1+res2)
效率比较 multithreading multiprocessing 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 import multiprocessing as mpimport threading as tdimport timedef job (q) : res = 0 for i in range(1000000 ): res += i+i**2 +i**3 q.put(res) 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 normal () : res = 0 for _ in range(2 ): for i in range(1000000 ): res += i+i**2 +i**3 print('normal:' , res) def multithread () : q = mp.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) 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 pool 是一个进程池,我们把值和函数传给进程池,进程池就会自动的分配进程。更为重要的一点是,进程池有返回值。
pool = mp.Pool()
如果 Pool 里面没有参数,则,默认分配所有的核,但是我们可以指定核数,比如两个核
pool = mp.Pool(processes = 2)
1 2 3 4 5 6 7 8 9 10 11 12 13 import multiprocessing as mpdef job (x) : return x * x def multicore () : pool = mp.Pool() res = pool.map(job,range(10 )) print(res) if __name__ == '__main__' : multicore()
只输出一个核的结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import multiprocessing as mpdef job (x) : return x * x def multicore () : pool = mp.Pool(processes=2 ) res = pool.map(job,range(10 )) print(res) res = pool.map_async(job,(5 ,)) print(res.get()) if __name__ == '__main__' : multicore()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import multiprocessing as mpdef job (x) : return x * x def multicore () : pool = mp.Pool(processes=2 ) res = pool.map(job,range(10 )) print(res) res = pool.map_async(job,(5 ,)) 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()
共享内存 我们在多个函数中共享一个全局变量,通常会有如下的代码
global A
但是,如果是多核的话,我们是无法通过 global 来共享值的。
共享值,我们会用到共享内存这个途径来解决。代码如下
Value(typecode_or_type, *args, lock=True)
typecode_or_type:定义了返回类型(转换成C语言中存储类型),它要么是一个ctypes类型,要么是一个代表ctypes类型的code。
*args:开辟一个空间,并赋一个args值,值得类型不限
mp.Value('i')
如果是 i 的话,那就是一个整数
d 的话,那就是一个小数
更多的值如下图
共享数组,在这里尤为注意的是,共享的数组只能是一维的,不能是多维的
array = mp.Array('i',[1,2,3])
# 下面这个是不合法的
array = mp.Array('i',[[1,2,3]])
lock 锁