forked from goodboy/tractor
Make "hard kill" just a `Process.terminate()`
It's not like any of this code is really being used anyway since we aren't indefinitely blocking for cancelled subactors to terminate (yet). Drop the `do_hard_kill()` bit for now and just rely on the underlying process api. Oh, and mark the nursery as cancelled asap.debug_tests
parent
d7a472c7f2
commit
fc2cb610b9
|
@ -137,19 +137,14 @@ class ActorNursery:
|
||||||
If ``hard_killl`` is set to ``True`` then kill the processes
|
If ``hard_killl`` is set to ``True`` then kill the processes
|
||||||
directly without any far end graceful ``trio`` cancellation.
|
directly without any far end graceful ``trio`` cancellation.
|
||||||
"""
|
"""
|
||||||
def do_hard_kill(proc):
|
self.cancelled = True
|
||||||
log.warning(f"Hard killing subactors {self._children}")
|
|
||||||
proc.terminate()
|
|
||||||
# XXX: below doesn't seem to work?
|
|
||||||
# send KeyBoardInterrupt (trio abort signal) to sub-actors
|
|
||||||
# os.kill(proc.pid, signal.SIGINT)
|
|
||||||
|
|
||||||
log.debug("Cancelling nursery")
|
log.critical("Cancelling nursery")
|
||||||
with trio.move_on_after(3) as cs:
|
with trio.move_on_after(3) as cs:
|
||||||
async with trio.open_nursery() as nursery:
|
async with trio.open_nursery() as nursery:
|
||||||
for subactor, proc, portal in self._children.values():
|
for subactor, proc, portal in self._children.values():
|
||||||
if hard_kill:
|
if hard_kill:
|
||||||
do_hard_kill(proc)
|
proc.terminate()
|
||||||
else:
|
else:
|
||||||
if portal is None: # actor hasn't fully spawned yet
|
if portal is None: # actor hasn't fully spawned yet
|
||||||
event = self._actor._peer_connected[subactor.uid]
|
event = self._actor._peer_connected[subactor.uid]
|
||||||
|
@ -169,7 +164,7 @@ class ActorNursery:
|
||||||
if chan:
|
if chan:
|
||||||
portal = Portal(chan)
|
portal = Portal(chan)
|
||||||
else: # there's no other choice left
|
else: # there's no other choice left
|
||||||
do_hard_kill(proc)
|
proc.terminate()
|
||||||
|
|
||||||
# spawn cancel tasks for each sub-actor
|
# spawn cancel tasks for each sub-actor
|
||||||
assert portal
|
assert portal
|
||||||
|
@ -178,13 +173,13 @@ class ActorNursery:
|
||||||
# if we cancelled the cancel (we hung cancelling remote actors)
|
# if we cancelled the cancel (we hung cancelling remote actors)
|
||||||
# then hard kill all sub-processes
|
# then hard kill all sub-processes
|
||||||
if cs.cancelled_caught:
|
if cs.cancelled_caught:
|
||||||
log.error(f"Failed to gracefully cancel {self}, hard killing!")
|
log.error(
|
||||||
async with trio.open_nursery():
|
f"Failed to cancel {self}\nHard killing process tree!")
|
||||||
for subactor, proc, portal in self._children.values():
|
for subactor, proc, portal in self._children.values():
|
||||||
nursery.start_soon(do_hard_kill, proc)
|
log.warning(f"Hard killing process {proc}")
|
||||||
|
proc.terminate()
|
||||||
|
|
||||||
# mark ourselves as having (tried to have) cancelled all subactors
|
# mark ourselves as having (tried to have) cancelled all subactors
|
||||||
self.cancelled = True
|
|
||||||
self._join_procs.set()
|
self._join_procs.set()
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue