Celery solves some cases for Python:
- background tasks; - tasks queues; - cron tasks.
And it's nice, I used it extensively. But in NO WAY it totally solves the GIL problem nor does it render coroutines obsolete.
Here are some celery limits:
- you need to calibrate the number of worker you have to match your workload.
- You are limited to x number of blocking operations, where x is the number of workers. It means you cannot do massively parallel I/O such as network operations with it (e.g: a web server).
- Tasks don't have access to your main process memory, and vice versa.
- Tasks cannot communicate with each others;
- You must juggle with the workflow of your tasks (is it ready ? it it dead ?). You can use await stuff() with a try/except;
- Celery is an additional process to setup and start, with backends to choose from and tuning to do. It's a lot more work than just importing an async lib.
Granted, celery is a very useful piece of software, but not the silver bullet this article depicts.