python补充之Multiprocessing(六)lock锁
上一章写了关于共享内存的问题,但是出现一个问题,如果多个进程对同一个共享变量做处理,会发生什么?应该会你抢过来处理一点,我抢过来处理一点,可以想象处理的结果很难控制和预测。所以需要lock锁,来保证一个进程完成之后,他所用的共享变量才可以被其他进程使用。
下面写了两个代码,来做一个比较。
以下是没有lock的代码:
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 multicore():
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__':
multicore()
在终端中:
pi@raspberrypi:~/Desktop/My_Project/Python_Learning $ python3 5_MultiprocessingLearning.py
结果:
1
4
5
8
9
12
13
16
17
20
21
24
25
28
29
32
33
36
37
40
可以看出,两个进程互相抢夺共享内存中的变量进行处理,显得很没有规律。
下面是加了lock后的代码:
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)) #传入锁
p2 = mp.Process(target=job, args=(v, 3, l))
p1.start()
p2.start()
p1.join()
p2.join()
if __name__ == '__main__':
multicore()
在终端中:
pi@raspberrypi:~/Desktop/My_Project/Python_Learning $ python3 5_MultiprocessingLearning.py
结果:
1
2
3
4
5
6
7
8
9
10
13
16
19
22
25
28
31
34
37
40
可以看出,是p1进程结束之后,p2进程才开始对共享变量v做处理。
支持就结束了,希望可以帮助到大家!