如何在多处理中将锁用作互斥锁?

How to use lock as a mutex in multiprocessing?

我想要两个进程,一个写一个读on/from同一个变量。写入的数据是这样的:

[0, 0]
[0, 1]
[1, 0]
[1, 1]
[2, 0]
[2, 1]
[3, 0]
[3, 1]
[4, 0]
[4, 1]
[5, 0]
[5, 1]
[6, 0]
[6, 1]
[7, 0]
[7, 1]
[8, 0]
[8, 1]
[9, 0]
[9, 1]

但是我遇到了麻烦,因为读取过程是读取变量之间的变化,形成新的对,所以我想使用一个Lock/Mutex来防止这种情况再次发生。我想我必须在更改之前锁定对象。 OBS:使用管理器在进程之间共享对象。

主要代码如下:

import multiprocessing

def mde(dad, mutex):
    for i in range(10):
        for j in range(2):
            mutex.acquire()
            dad[0] = i
            dad[1] = j
            mutex.release()
def mda(dad):
    c = 0
    while c < 30:
        print(dad)
        c += 1

if __name__ == '__main__':
    manager = multiprocessing.Manager()
    mutex = manager.Lock()
    dado = manager.list([0, 0])
    p1 = multiprocessing.Process(target=mde, args=(dado, mutex,))
    p2 = multiprocessing.Process(target=mda, args=(dado,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

如您所见,我在写入过程中尝试了锁定和解锁变量,但结果仍然是混乱的。我做错了什么?

这是更正后的版本(归功于 MisterMiyagi)。两个工作人员都在等待对方完成他们的任务,即修改列表或显示列表。

import multiprocessing

NX = 10
NY = 2


def mde(dad, mutex):
    for i in range(NX):
        for j in range(NY):
            mutex.acquire()
            dad[0] = i
            dad[1] = j
            mutex.release()


def mda(dad, mutex):
    c = 0
    while c <= NX*NY:
        mutex.acquire()
        print(dad)
        c += 1
        mutex.release()

if __name__ == '__main__':
    manager = multiprocessing.Manager()
    mutex = manager.Lock()
    dado = manager.list([0, 0])
    p1 = multiprocessing.Process(target=mde, args=(dado, mutex,))
    p2 = multiprocessing.Process(target=mda, args=(dado, mutex,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()