У меня есть программа, где multiprocessing
Возможно ли установить приоритет блокировки?
- один процесс добавляет элементы в общий список (
multiprocessing.Manager().list()
) - несколько других процессов потребить эти элементы из этого списка (и удалить их); они запускаются до тех пор, пока в списке что-то не обработает, и вышеописанный процесс все еще добавляет в список.
Я добавил блокировку (через multiprocessing.Lock()
) при добавлении в список или удаление его. Поскольку существует один «фидерный» процесс и несколько (10-40) «потребительских», все конкурирующие за блокировку, и что потребительские процессы бывают быстрыми, я получаю процесс «фидера», который с трудом приобретает блокировку.
Есть ли понятие «приоритет» при приобретении замка? Я бы хотел, чтобы процесс «фидера» приобрел его с большим приоритетом, чем остальные.
В настоящее время я смягчил проблему, когда «потребительские» процессы ждут случайного времени, прежде чем пытаться получить блокировку, пока процесс «фидер» (когда он заканчивается, устанавливает флаг). Это обходное решение, которое работает, но оно уродливое и вряд ли эффективно (у меня есть процессы, ожидающие random.random()*n
секунд, где n
- это количество процессов. Это полностью заполненный номер, возможно, неправильный).
как понятие "очереди" реализуется? Вы просто добавляете процессы в список, когда они приходят за блокировкой? –
@ Ev.Kounis: да, это «multiprocessing.Manager(). List()», как я упоминал в вопросе (это не «multiprocessing.Queue()») – WoJ
Я не имею в виду список в какие элементы добавляются и извлекаются из, я имею в виду структуру (список?), которая отслеживает приоритет процессов. –