创建进程
import multiprocessing as mp
import threading as td
def job(a,d):
print('aaaaa')
if_name='_main_': #要在这个框架下运用它,不然会报错
p1=mp.Process(target=job,arg=(1,2)) #创建进程
p1.start()
p1.join()
queue输出
def 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,arg=(q,)) #q后要有逗号,不然会报错
p2=mp.Process(target=job,arg=(q,))
p1.start()
p2.start()
p1.join()
p2.join()
res1=q.get()
res2=q.get()
print(res1+res2)
进程池pool
之前的process中的job是不能有返回值的,只能把返回值放在Q里。在pool里有return
def job(x):
return x*x
def multicore():
pool=mp.Pool(processes=2) #使用2个核
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])
pool.close() #关闭pool,使其不在接受新的(主进程)任务
pool.join()
共享内存
value=mp.Value('i',1) #定义一个变量,可以被每个cpu读取。i为整数,d为小数
array=mp.Array('i',[1,2,3]) #列表,不能是多维的
lock锁
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))
p2=mp.Process(target=job,args(v,3,l))
p1.start()
p2.start()
p1.join()
p2.join()
加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行的修改,没错,速度是慢了,牺牲了速度而保证了数据安全。
python multiprocessing 如何在主进程中捕获子进程抛出的异常,适用于子进程无返回值的场景
Python3之无法在进程池中使用队列Queue的解决方案
multiprocessing.Queue()和manger().Queue()的区别
queue.Queue(),实现一个大小固定的队列