DevLog 2018 December 23
Contents
I have enjoyed keeping running logs of my coding work (devlogs) in the past, and am going to start doing those again now.
This ‘holiday’ season, I am spending time teaching myself skills I sortof know about but do not have a deep understanding of.
JupyterLab extension
I spent the first part of the day (before I started devlogging) working on finishing up a jupyterlab extension I started the day before. It lets you edit notebook metadata. I got started since I wanted to use Jupytext for my work on publishing mybinder.org-analytics.
TypeScript was easy to pick up coming from C#. I wish the phospor / JupyterLab code had more documentation though.
I ran into a bug. While following instructions to set up a JupyterLab dev setup, I somehow managed to delete my source code. Thankfully I got most of it back thanks to a saved copy in vscode. It was a sour start to the morning though.
I’ll get back on to this once the sour taste is gone, and hopefully the bug is fixed :)
asyncio: what’s next | Yuri Selivanov @ PyBay 2018
I’ve been trying to get a better handle on asyncio. I can use it, but I don’t fully understand it - I am probably leaving bugs everywhere…
From one of the asyncio maintainers. Gave me some impetus to push the default version of Python on mybinder.org to 3.7 :D I’m most excited about getting features from Trio & Curio into the standard library. Was good to hear that nobody can quite figure out exception handling, and not just me.
I discovered aioutils
while searching around after this. I’ve copy pasted code that
theoretically does the same things as Group
and Pool
from
aioutils
, but I’ve no idea if they are right. I’ll be using
this library from now!
Processing Signals
I’m writing a simple process supervisor library to replace the janky parts of nbserverproxy. It should have the following features:
- Restart processes when they die
- Propagate signals appropriately
- Support a sense of ‘readiness’ probes (not liveness)
- Be very well tested
- Run on asyncio
This is more difficult than it seems, and am slowly working my way through it. (1) isn’t too difficult.
(2) is a fair bit more difficult. atexit
is useless since it doesn’t do
anything with SIGTERM. So I need to manage my own SIGTERM
handlers. However, this means there needs to be a centralish
location of some sort that decides when to exit. This introduces
global state, and I don’t like that at all. But unix signals are
global, and maybe there’s nothing for me to do here.
I initially created a Supervisor class that holds a bunch of SupervisedProcess’s, but it was still calling sys.exit in it. Since signals are global, I realize there’s no other real way to handle this, and so I made a global handler setup too. This has the additional advantage of being able to remove handlers when a SupervisedProcess dies, avoiding memory leaks and stuff.
Testing this stuff is hard!
I also need to make sure I don’t end up with lots of races. I’m still writing concurrent code, even without threads. Gotta be careefull. Especially with signals thrown in. Although I guess once you get a SIGTERM or SIGINT inconsistent state is not particularly worrysome.
Author Yuvi
LastMod 2018-12-23