Thespian
Thespian copied to clipboard
ChildActorExited - Manually killing child PID does not result in ChildActorExited Message to Parent
Code
Below is example code which has reproduced this issue for me.
Project structure
.
├── app
│ ├── __init__.py
│ ├── parent.py
│ └── child.py
├── start.py
└── stop.py
start.py
from thespian.actors import ActorSystem
from app import parent
if __name__ == '__main__':
asys = ActorSystem('multiprocTCPBase')
actor = asys.createActor(parent.Parent)
asys.tell(actor, parent.Initialize())
stop.py
from thespian.actors import ActorSystem
if __name__ == '__main__':
ActorSystem('multiprocTCPBase').shutdown()
parent.py
from thespian.actors import ActorTypeDispatcher
import os
class Initialize:
def __init__(self):
pass
class Parent(ActorTypeDispatcher):
def __init__(self, *args, **kwargs):
super(Parent, self).__init__(*args, **kwargs)
self._child = None
def receiveMsg_Initialize(self, msg, sender):
print(f'{self.myAddress} (P|:{os.getpid()}) Parent received Initialize command from {sender}')
self._child = self.createActor('app.child.Child')
self.send(self._child, Initialize())
def receiveMsg_ChildActorExited(self, msg, sender):
print(f'In Parent: ChildActorExited')
child.py
from thespian.actors import ActorTypeDispatcher
import os
class Child(ActorTypeDispatcher):
def __init__(self, *args, **kwargs):
super(Child, self).__init__(*args, **kwargs)
def receiveMsg_Initialize(self, msg, sender):
print(f'{self.myAddress} (P|:{os.getpid()}) Child received Initialize command from {sender}')
Procedure
- Navigate to the root of my project.
~$ cd ~/Documents/thespian/test
- Start the actor system using
start.py
~/Documents/thespian/test$ python start.py
ActorAddr-(T|:1111) (P|:5555) Parent received Initialize command from ActorAddr-(T|:0000)
ActorAddr-(T|:2222) (P|:6666) Child received Initialize command from ActorAddr-(T|:1111)
- Kill the child actor process by its PID.
~/Documents/thespian/test$ kill -9 6666
- After tests, shut down actor system.
~/Documents/thespian/test$ python stop.py
Problem
From the procedure above, upon killing the child process in step 3, it is to my understanding that the parent actor should immediately receive a ChildActorExited
message and my example program should print out ChildActorExited
to the terminal; this, however, does not happen. Instead the remaining parent actor will stay alive and report nothing.
I have tested this same functionality on MacOS and Windows with the same results. I also tried using multiprocUDPBase
but again got the same results.
Another thing to note is after killing the child process and running stop.py
, the actor system takes a bit longer than usual to shutdown however it does not print any additional information.
Environment
- These tests were performed in fresh virtual environments where the only pip package installed was
thespian
. - I have tested this on MacOS Monterey (12.1) as well as Windows 10 (20H2).
- On both operating systems, I have tested using various python versions (3.7.3, 3.8.6, 3.9.9).
- I have also tested on a couple versions of Thespian (3.9.11, 3.10.6).
If you need any additional information, please let me know.