Запускайте свой код, пока не получите первый результат, а затем убейте все оставшиеся дочерние процессы:
n concurrent.futures и ProcessPoolExecutor предоставляют удобный интерфейс для планирования и мониторинга задач. Даже фьючерсыпредоставлять метод .cancel ():
отменить(): Попытка отменить звонок. Если звонокв настоящее время выполняется и не может быть отменено тогда метод вернет False, в противном случае вызов будет отменен, а метод вернет True.
К сожалению в симмиларевопрос (относительно asyncio) ответ утверждает, что выполняемые задачи не могут быть отменены с использованием этого фрагмента документации, но документы не говорят об этом, только если они выполняются И не могут быть отменены.
Отправка multiprocessing.Events в процессы также не является тривиально возможной (это делается с помощью параметров, как в multiprocess.Process возвращает RuntimeError)
Что я пытаюсь сделать? Я хотел бы разбить пространство поиска и запустить задачу для каждого раздела. Но для этого достаточно ОДНОГО решения, и этот процесс требует значительных ресурсов процессора. Так есть ли действительно удобный способ сделать это, который не компенсирует выгоды с помощью ProcessPool для начала?
Пример:
from concurrent.futures import ProcessPoolExecutor, FIRST_COMPLETED, wait
# function that profits from partitioned search space
def m_run(partition):
for elem in partition:
if elem == 135135515:
return elem
return False
futures = []
# used to create the partitions
steps = 100000000
with ProcessPoolExecutor(max_workers=4) as pool:
for i in range(4):
# run 4 tasks with a partition, but only *one* solution is needed
partition = range(i*steps,(i+1)*steps)
futures.append(pool.submit(m_run, partition))
done, not_done = wait(futures, return_when=FIRST_COMPLETED)
for d in done:
print(d.result())
print("---")
for d in not_done:
# will return false for Cancel and Result for all futures
print("Cancel: "+str(d.cancel()))
print("Result: "+str(d.result()))