Celery workers default to acknowledging messages messages as soon as they've been recieved, leading to them failing to be processed if the worker crashes. Dramatiq, by contrast, will only acknowledge a message once a worker has finished processing it. As a result each message may be processed multiple times (if the previous worker handling it crashes), but there's a guarantee that each message will be processed to completion at least once.
They also call more attention in their docs to how to make the broker confirm message delivery than Celery does. Overall Dramatiq seems more concerned with robustness and reliability than most other Python task queue frameworks.