Python concurrent.futures и ProcessPoolExecutor предоставляют удобный интерфейс для планирования и мониторинга задач. Futures даже предоставляет метод .cancel () :
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()))
Event
в глобальную переменную вместо того, чтобы передавать ее в качестве параметра, см. stackoverflow.com/questions/1675766/ - person niemmi   schedule 14.03.2017