Разделяемая память в пуле процессов

#python #multiprocessing #shared-memory

#python #многопроцессорная обработка #разделяемая память

Вопрос:

Я пытаюсь разделить память между 4 процессами, но у меня это не работает, я хотел бы получить помощь в решении моей проблемы.

Взгляните на логику потока:

 from multiprocessing import Pool, Value
from time import sleep

def work(process):
    if process == 'A':
        sleep(secs=2)     # Processing task A
        a = True          # Marking a shared byte of completed task
    if process == 'B':
        sleep(secs=1)     # Starting processing task B
        while a is False: # Waiting until task A will complete
            pass
        sleep(secs=5)     # Continuing processing task B
        b = True          # Marking a shared byte of completed task
    if process == 'C':
        sleep(secs=7)     # Processing task C
    if process == 'D':
        sleep(secs=1)     # Starting processing task D
        while b is False: # Waiting until task B will complete
            pass
        sleep(secs=4)     # Continuing processing task D

def main():
    a = Value('b', False)
    b = Value('b', False)

    with Pool(processes=4) as pool:
        pool.map(func=work, iterable=('A', 'B', 'C', 'D'))

if __name__ == '__main__':
    main()
  

Я не могу поделиться значениями a и b как мне это сделать?

Большое спасибо!

Ответ №1:

Во-первых, функция sleep не принимает secs= параметр ключевого слова. Во-вторых, вам нужно передать значения a и b вашей функции work в качестве аргументов. В-третьих, вам необходимо установить и протестировать value атрибут ваших Value экземпляров. В-четвертых, поскольку вы передаете эти аргументы процессам пула, вы должны получить Value экземпляры из SyncManager экземпляра, как показано ниже.

 from multiprocessing import Pool, Manager
from time import sleep
from functools import partial

def work(a, b, process):
    if process == 'A':
        sleep(2)     # Processing task A
        print('A is marking a True')
        a.value = True          # Marking a shared byte of completed task
    elif process == 'B':
        sleep(1)     # Starting processing task B
        while a.value is False: # Waiting until task A will complete
            pass
        sleep(5)     # Continuing processing task B
        print('B is marking b True')
        b.value = True          # Marking a shared byte of completed task
    elif process == 'C':
        sleep(7)     # Processing task C
    elif process == 'D':
        sleep(1)     # Starting processing task D
        while b.value is False: # Waiting until task B will complete
            pass
        print('D has now found b to be True')
        sleep(4)     # Continuing processing task D

def main():
    manager = Manager()
    a = manager.Value('b', False)
    b = manager.Value('b', False)

    with Pool(processes=4) as pool:
        pool.map(func=partial(work, a, b), iterable=('A', 'B', 'C', 'D'))

if __name__ == '__main__':
    main()
  

С принтами:

 A is marking a True
B is marking b True
D has now found b to be True
  

Ответ №2:

Вы можете использовать очередь (многопроцессорная обработка.Очередь () ) для передачи сообщений туда и обратно.

Смотрите эту ссылку https://pymotw.com/2/multiprocessing/communication.html