Как использовать блокировку как мьютекс в многопроцессорной обработке? - PullRequest
0 голосов
/ 17 февраля 2020

Я хочу иметь два процесса, один для записи и один для чтения из одной и той же переменной. Записанные данные выглядят так:

[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()

Как вы можете видеть, я пытался заблокировать и разблокировать переменную в процессе записи, но результат все еще был перепутан. Что я делаю не так?

1 Ответ

1 голос
/ 17 февраля 2020

Вот исправленная версия (благодарность 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()
...