多进程写法和多线程类似 (多进程不能在jupyter中运行)
import multiprocessing as mp # 加载多进程包
def job(q,a):
s = 0
for i in range(a):
s += i
q.put(s)
def main():
q = mp.Queue() # 定义一个队列
p1 = mp.Process(target = job,args = (q,10))
p2 = mp.Process(target = job,args = (q,20))
p1.start()
p2.start()
p1.join()
p2.join()
res1 = q.get()
res2 = q.get()
print(res1)
print(res2)
if __name__ == '__main__':
main()
进程池
import multiprocessing as mp
def job(x):
return x**2
def multiP():
pool = mp.Pool(processes = 2) # 定义一个进程池 processes = 2 指使用两个核进行计算
res = pool.map(job,range(10)) # map可以有返回值
print(res)
res = pool.apply_async(job,(2,)) # apply_async() 只能传入一个值
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__':
multiP()
定义共享内存
import multiprocessing as mp
value = mp.Value('d',1.2) #定义一个共享值 类型为小数(‘d’)
array = mp.Array('i',[1,2,3]) # 定义一个共享数组 类型为整数(‘i’) 数组只能是一维的
进程锁
import multiprocessing as mp
import time
def job(v,num):
for _ in range(10):
time.sleep(0.1)
v.value += num
print(v.value)
def main():
v = mp.Value('i',0)
p1 = mp.Process(target = job,args = (v,1))
p2 = mp.Process(target = job,args = (v,3))
p1.start()
p2.start()
p1.join()
p2.join()
if __name__ == '__main__':
main()
无锁输出:
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 main():
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()
if __name__ == '__main__':
main()
有锁输出:
参考:
莫烦python
https://www.bilibili.com/video/av16944405/