forked from goodboy/tractor
1
0
Fork 0

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
Tyler Goodlet 2020-09-28 13:49:45 -04:00
parent d7a472c7f2
commit fc2cb610b9
1 changed files with 9 additions and 14 deletions

View File

@ -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()