diff --git a/distributed/worker.py b/distributed/worker.py index 35ebf04c75..cd7f60efea 100644 --- a/distributed/worker.py +++ b/distributed/worker.py @@ -2986,35 +2986,35 @@ def apply_function_simple( # m.stop - m.start # Difference in wall time before and after function call, without subtracting # anything. This is used in scheduler heuristics, e.g. task stealing. - with context_meter.meter("thread-noncpu", func=time) as m: - with context_meter.meter("thread-cpu", func=thread_time): - try: - result = function(*args, **kwargs) - except (SystemExit, KeyboardInterrupt): - # Special-case these, just like asyncio does all over the place. They - # will pass through `fail_hard` and `_handle_stimulus_from_task`, and - # eventually be caught by special-case logic in asyncio: - # https://github.com/python/cpython/blob/v3.9.4/Lib/asyncio/events.py#L81-L82 - # Any other `BaseException` types would ultimately be ignored by asyncio - # if raised here, after messing up the worker state machine along their - # way. - raise - except BaseException as e: - # Users _shouldn't_ use `BaseException`s, but if they do, we can assume - # they aren't a reason to shut down the whole system (since we allow the - # system-shutting-down `SystemExit` and `KeyboardInterrupt` to pass - # through) - msg = error_message(e) - msg["op"] = "task-erred" - msg["actual-exception"] = e - else: - msg = { - "op": "task-finished", - "status": "OK", - "result": result, - "nbytes": sizeof(result), - "type": type(result) if result is not None else None, - } + with ( + context_meter.meter("thread-noncpu", func=time) as m, + context_meter.meter("thread-cpu", func=thread_time), + ): + try: + result = function(*args, **kwargs) + except (SystemExit, KeyboardInterrupt): + # Special-case these, just like asyncio does all over the place. They will + # pass through `fail_hard` and `_handle_stimulus_from_task`, and eventually + # be caught by special-case logic in asyncio: + # https://github.com/python/cpython/blob/v3.9.4/Lib/asyncio/events.py#L81-L82 + # Any other `BaseException` types would ultimately be ignored by asyncio if + # raised here, after messing up the worker state machine along their way. + raise + except BaseException as e: + # Users _shouldn't_ use `BaseException`s, but if they do, we can assume they + # aren't a reason to shut down the whole system (since we allow the + # system-shutting-down `SystemExit` and `KeyboardInterrupt` to pass through) + msg = error_message(e) + msg["op"] = "task-erred" + msg["actual-exception"] = e + else: + msg = { + "op": "task-finished", + "status": "OK", + "result": result, + "nbytes": sizeof(result), + "type": type(result) if result is not None else None, + } msg["start"] = m.start + time_delay msg["stop"] = m.stop + time_delay