#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