Если вы отправляете функцию в ThreadPoolExecutor
, исполнитель запустит функцию в потоке и сохранит возвращаемое значение в объекте Future
. Поскольку количество одновременных потоков ограничено, у вас есть возможность отменить ожидающее выполнение будущего, но как только управление в рабочем потоке будет передано вызываемому объекту, нет способа остановить выполнение.
Рассмотрим этот код:
import concurrent.futures as f
import time
T = f.ThreadPoolExecutor(1) # Run at most one function concurrently
def block5():
time.sleep(5)
return 1
q = T.submit(block5)
m = T.submit(block5)
print q.cancel() # Will fail, because q is already running
print m.cancel() # Will work, because q is blocking the only thread, so m is still queued
В общем, всякий раз, когда вы хотите иметь что-то, что можно отменить, вы сами несете ответственность за то, чтобы убедиться, что это возможно.
Хотя есть и готовые варианты. Например, рассмотрите возможность использования asyncio, они также имеют пример использования сна. Эта концепция позволяет обойти проблему, всякий раз, когда должна быть вызвана любая потенциально блокирующая операция, вместо этого возвращая управление циклу управления, работающему в самом внешнем контексте, вместе с примечанием о том, что выполнение должно быть продолжено всякий раз, когда доступен результат, или, в вашем случае, по прошествии n
секунд.
person
Phillip
schedule
25.07.2016