python补充之Multiprocessing(六)lock锁

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做处理。

支持就结束了,希望可以帮助到大家!

猜你喜欢

转载自blog.csdn.net/weixin_44086593/article/details/87595895