Вот простой код:
@shared_task(time_limit=10, soft_time_limit=5)
def check_action():
try:
__import__("time").sleep(100)
except celery.exceptions.SoftTimeLimitExceeded as e:
print("Here", e, type(e))
except BaseException as e:
print("There", e, type(e))
Это shared_task
с настройками time_limit
и soft_time_limit
, поэтому я ожидаю, что через 100 секунд будет напечатано Here
(вместе с * 1008).* информация об исключении), а затем There
будет напечатано с некоторым исключением из режима ожидания.
Вместо этого он вообще не вызывает SoftTimeLimitExceeded
, вызывается только жесткий лимит времени, полный вывод:
celery_1 | [2019-05-31 21:36:36,709: WARNING/MainProcess] There
celery_1 | [2019-05-31 21:36:36,710: WARNING/MainProcess] 10 seconds
celery_1 | [2019-05-31 21:36:36,710: WARNING/MainProcess] <class 'gevent.timeout.Timeout'>
Как видно из журналов, я использую gevent
рабочих, если это поможет.
UPD # 1: проблемы, похоже, с gevent
pool (если я удаляю --pool=gevent
, все работает отлично).
UPD #2: eventlet
пул, похоже, не поддерживает ни один тайм-аут, даже жесткий.