进程(同步)锁

很多时候,我们需要在多个进程中同时写一个文件,如果不加锁机制,就会导致写文件错乱

这个时候,我们可以使用multiprocessing.Lock()

我一开始是这样使用的:

from multiprocessing import Process, Lock
#锁要从从multiprocessing导入

def f(l, i):#l为锁,i为传入的值
    l.acquire()#获得一把锁
    print('hello world', i)
    l.release()#释放锁

if __name__ == '__main__':
    lock = Lock()#生成1个锁的实例

    for num in range(10):#创建10个子进程
        Process(target=f, args=(lock, num)).start()#将锁传给子进程

  结果:

hello world 1
hello world 3
hello world 2
hello world 5
hello world 0
hello world 6
hello world 9
hello world 7
hello world 4
hello world 8

  发现这种方式,锁并没有起作用, 文件内容依然出现了错乱,所以这种方式,虽然lock通过参数传到了每个进程中,但是我们知道进程之间是不共享内存的,所以我理解应该是每个进程获得的锁其实是不同的, 所以无法对写文件起到加锁的效果。以下为进程锁的用处:

进程锁-----进程与进程之间是独立的,为何需要锁?

对于进程同步,屏幕的输出只有一个,此时就涉及到资源的竞争(比如会使上述代码结果打印hello world 1还没打印完,就打印出hello world 3)。在Linux的Python2.x中可能出现问题。这仅仅是一种情况,多个进程之间虽然是独立的,但仅限于内存和运算,如果涉及到其它一些资源,就可能存在竞争问题,在实际使用过程中要注意思考和防范错误。

原文地址:https://www.cnblogs.com/tianqizhi/p/9441054.html