Python Multiprocessing :: порождает детей и убивает всех детей, когда удовлетворены критерии выхода - PullRequest
1 голос
/ 23 октября 2019

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

def match(a, b, feature) -> boolean:
  # time.sleep([0 - 10]) # simulates a long time-consuming function
  # return isMatch       # could be True or False depending on whether feature was found

p = Pool(processes=4)
list = p.map(match, [
  ['imgA', 'img1', feature],
  ['imgA', 'img2', feature],
  ['imgA', 'img3', feature],
  ['imgA', 'img4', feature],
  ['imgA', 'img5', feature],
  ...
  ...
  ['imgA', 'img100', feature],
])
found = next(x for x in list if x == True, False)

Это прекрасно работает. Кстати, я на самом деле не жестко программирую массив параметров. Это только для иллюстрации. Однако у меня есть пара вопросов относительно этого подхода:

  1. В настоящий момент управление не возвращается ко мне, пока все 100 процессов не завершили выполнение, даже если совпадение было найдено оченьна ранней стадии. Есть ли способ, которым я мог бы сигнализировать от одного из дочерних процессов, что он успешно завершен, чтобы родительский процесс мог завершить все порожденные процессы и удалить любые ожидающие процессы в очереди?

  2. Если этовозможно, я хотел бы убедиться, что, если этот родительский процесс сам был порожден, дочерний процесс, имеющий успех, также не убил бы дочерние процессы родительского процесса родителя. В этом примере я сохранил a и feature постоянными. Я хотел бы расширить это решение, чтобы иметь в качестве списков a и b. В этом случае для каждого a я бы порождал дочерний процесс для обработки одного a против всех возможных b с, что в свою очередь должно порождать внуков, которые обрабатывали бы один a против одногоb. Каждый раз, когда я нахожу совпадение между a и b, я хотел бы завершить все внуки для дочернего процесса, который обрабатывал один a против всех возможных b с.

Если кто-то может направить меня в правильном направлении или даже в библиотеке, которая сделает это для меня, я был бы очень благодарен. =)

Большое спасибо, Асим

...