Попытка написать на основе процесса тайм-аут (синхронизация) по дешевке, как это:
from concurrent.futures import ProcessPoolExecutor
def call_with_timeout(func, *args, timeout=3):
with ProcessPoolExecutor(max_workers=1) as pool:
future = pool.submit(func, *args)
result = future.result(timeout=timeout)
Но, похоже, аргумент timeout
, переданный future.result , на самом деле не работает так, как рекламируется.
>>> t0 = time.time()
... call_with_timeout(time.sleep, 2, timeout=3)
... delta = time.time() - t0
... print('wall time:', delta)
wall time: 2.016767978668213
OK.
>>> t0 = time.time()
... call_with_timeout(time.sleep, 5, timeout=3)
... delta = time.time() - t0
... print('wall time:', delta)
# TimeoutError
Не в порядке - разблокируется через 5 секунд , а не через 3 секунды.
Связанные вопросы показывают, как это сделать с пулами потоков или с signal . Как отключить процесс, отправленный в пул, через n секунд, без использования какого-либо _private API многопроцессорной обработки? Жесткое уничтожение - это нормально, нет необходимости запрашивать полное отключение.