Agreed on Celery - I had to dig around in that source a few times to build extensions or investigate bugs, and hooooly cow. That is some of my least-favorite Python code ever.... for a task queue. It's extremely fancy[1], probably in part because it does so much to make it "fluent"-feeling (which is honestly pretty neat).
As to building your own queue: if you can tolerate small loss on outages, redis + optionally a persisting replica makes things truly trivial. You can build a safe queue in a day with a small "pop into in-progress list" pipeline/script and a monitoring daemon to detect lost tasks. Monitoring daemons and dumb workers are super simple.
[1] or at least it was, a few years ago. it felt like reading an exploration of every single metaprogramming feature that Python offers, all interacting with each other.