У меня есть функция, которая последовательно ищет определенную функцию в списке файлов изображений и завершает работу, как только находит совпадение. Для запуска функции требуется почти секунда, поэтому я надеялся использовать многопроцессорность, чтобы посмотреть, смогу ли я ее ускорить.
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)
Это прекрасно работает. Кстати, я на самом деле не жестко программирую массив параметров. Это только для иллюстрации. Однако у меня есть пара вопросов относительно этого подхода:
В настоящий момент управление не возвращается ко мне, пока все 100 процессов не завершили выполнение, даже если совпадение было найдено оченьна ранней стадии. Есть ли способ, которым я мог бы сигнализировать от одного из дочерних процессов, что он успешно завершен, чтобы родительский процесс мог завершить все порожденные процессы и удалить любые ожидающие процессы в очереди?
Если этовозможно, я хотел бы убедиться, что, если этот родительский процесс сам был порожден, дочерний процесс, имеющий успех, также не убил бы дочерние процессы родительского процесса родителя. В этом примере я сохранил a
и feature
постоянными. Я хотел бы расширить это решение, чтобы иметь в качестве списков a
и b
. В этом случае для каждого a
я бы порождал дочерний процесс для обработки одного a
против всех возможных b
с, что в свою очередь должно порождать внуков, которые обрабатывали бы один a
против одногоb
. Каждый раз, когда я нахожу совпадение между a
и b
, я хотел бы завершить все внуки для дочернего процесса, который обрабатывал один a
против всех возможных b
с.
Если кто-то может направить меня в правильном направлении или даже в библиотеке, которая сделает это для меня, я был бы очень благодарен. =)
Большое спасибо, Асим