Запускайте свой код, пока не получите первый результат, а затем убейте все оставшиеся дочерние процессы:

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()))

Ответы на вопрос(3)

Ваш ответ на вопрос