Switch nursery to `CancelScope`-status properties
Been meaning to do this forever and a recent test hang finally drove me to it Bp Like it sounds, adopt the "cancel-status" properties on `ActorNursery` use already on our `Context` and derived from `trio.CancelScope`: - add new private `._cancel_called` (set in the head of `.cancel()`) & `._cancelled_caught` (set in the tail) instance vars with matching read-only `@properties`. - drop the instance-var and instead delegate a `.cancelled: bool` property to `._cancel_called` and add a usage deprecation warning (since removing it breaks a buncha tests).to_asyncio_eoc_signal
parent
aaed3a4a37
commit
024e8015da
|
@ -117,7 +117,6 @@ class ActorNursery:
|
||||||
]
|
]
|
||||||
] = {}
|
] = {}
|
||||||
|
|
||||||
self.cancelled: bool = False
|
|
||||||
self._join_procs = trio.Event()
|
self._join_procs = trio.Event()
|
||||||
self._at_least_one_child_in_debug: bool = False
|
self._at_least_one_child_in_debug: bool = False
|
||||||
self.errors = errors
|
self.errors = errors
|
||||||
|
@ -135,10 +134,53 @@ class ActorNursery:
|
||||||
# TODO: remove the `.run_in_actor()` API and thus this 2ndary
|
# TODO: remove the `.run_in_actor()` API and thus this 2ndary
|
||||||
# nursery when that API get's moved outside this primitive!
|
# nursery when that API get's moved outside this primitive!
|
||||||
self._ria_nursery = ria_nursery
|
self._ria_nursery = ria_nursery
|
||||||
|
|
||||||
|
# TODO, factor this into a .hilevel api!
|
||||||
|
#
|
||||||
# portals spawned with ``run_in_actor()`` are
|
# portals spawned with ``run_in_actor()`` are
|
||||||
# cancelled when their "main" result arrives
|
# cancelled when their "main" result arrives
|
||||||
self._cancel_after_result_on_exit: set = set()
|
self._cancel_after_result_on_exit: set = set()
|
||||||
|
|
||||||
|
# trio.Nursery-like cancel (request) statuses
|
||||||
|
self._cancelled_caught: bool = False
|
||||||
|
self._cancel_called: bool = False
|
||||||
|
|
||||||
|
@property
|
||||||
|
def cancel_called(self) -> bool:
|
||||||
|
'''
|
||||||
|
Records whether cancellation has been requested for this
|
||||||
|
actor-nursery by a call to `.cancel()` either due to,
|
||||||
|
- an explicit call by some actor-local-task,
|
||||||
|
- an implicit call due to an error/cancel emited inside
|
||||||
|
the `tractor.open_nursery()` block.
|
||||||
|
|
||||||
|
'''
|
||||||
|
return self._cancel_called
|
||||||
|
|
||||||
|
@property
|
||||||
|
def cancelled_caught(self) -> bool:
|
||||||
|
'''
|
||||||
|
Set when this nursery was able to cance all spawned subactors
|
||||||
|
gracefully via an (implicit) call to `.cancel()`.
|
||||||
|
|
||||||
|
'''
|
||||||
|
return self._cancelled_caught
|
||||||
|
|
||||||
|
# TODO! remove internal/test-suite usage!
|
||||||
|
@property
|
||||||
|
def cancelled(self) -> bool:
|
||||||
|
warnings.warn(
|
||||||
|
"`ActorNursery.cancelled` is now deprecated, use "
|
||||||
|
" `.cancel_called` instead.",
|
||||||
|
DeprecationWarning,
|
||||||
|
stacklevel=2,
|
||||||
|
)
|
||||||
|
return (
|
||||||
|
self._cancel_called
|
||||||
|
# and
|
||||||
|
# self._cancelled_caught
|
||||||
|
)
|
||||||
|
|
||||||
async def start_actor(
|
async def start_actor(
|
||||||
self,
|
self,
|
||||||
name: str,
|
name: str,
|
||||||
|
@ -316,7 +358,7 @@ class ActorNursery:
|
||||||
|
|
||||||
'''
|
'''
|
||||||
__runtimeframe__: int = 1 # noqa
|
__runtimeframe__: int = 1 # noqa
|
||||||
self.cancelled = True
|
self._cancel_called = True
|
||||||
|
|
||||||
# TODO: impl a repr for spawn more compact
|
# TODO: impl a repr for spawn more compact
|
||||||
# then `._children`..
|
# then `._children`..
|
||||||
|
@ -394,6 +436,8 @@ class ActorNursery:
|
||||||
) in children.values():
|
) in children.values():
|
||||||
log.warning(f"Hard killing process {proc}")
|
log.warning(f"Hard killing process {proc}")
|
||||||
proc.terminate()
|
proc.terminate()
|
||||||
|
else:
|
||||||
|
self._cancelled_caught
|
||||||
|
|
||||||
# mark ourselves as having (tried to have) cancelled all subactors
|
# mark ourselves as having (tried to have) cancelled all subactors
|
||||||
self._join_procs.set()
|
self._join_procs.set()
|
||||||
|
|
Loading…
Reference in New Issue