I'm testing celery in a local environment. My Python file has the following two lines of code:
celery_app.send_task('tasks.test1', args=[self.id], kwargs={})
celery_app.send_task('tasks.test2', args=[self.id], kwargs={})
Looking at the console output they seem to execute one after another in sequence. But test2 only runs after test1 has finished. At least this is the way it seems reading the console output.
These tasks have no dependancies on each other so I don't want one task waiting for another to complete before moving onto the next line.
How can I execute both tasks as the same time?
---- **** -----
--- * *** * -- Darwin-14.0.0-x86_64-i386-64bit
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: tasks:0x104cd8c10
- ** ---------- .> transport: sqs://123
- ** ---------- .> results: disabled
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ----
--- ***** ----- [queues]
-------------- .> celery exchange=celery(direct) key=celery
Celery provides a way to both design a workflow for coordination and also execute tasks in parallel.
celery beats only trigger those 1000 tasks (by the crontab schedule), not run them. If you want to run 1000 tasks in parallel, you should have enough celery workers available to run those tasks.
As for --concurrency celery by default uses multiprocessing to perform concurrent execution of tasks. The number of worker processes/threads can be changed using the --concurrency argument and defaults to the number of available CPU's if not set.
So Celery (and other queue frameworks) has other benefits as well - Think of it as a 'task/function manager' rather then just a way of multithreading.
There are multiple ways to achieve this.
1. Single Worker - Single Queue.
$ celery -A my_app worker -l info -c 2 -n my_worker
This will start a worker which executes 2 tasks at the same time.
2. Multiple workers - Single Queue.
$ celery -A my_app worker -l info -c 1 -n my_worker1
$ celery -A my_app worker -l info -c 1 -n my_worker2
This will start two workers which executes one task at a time. Note both tasks are in the same queue.
3. Multiple workers - Multiple Queues.
$ celery -A my_app worker -l info -c 1 -n my_worker1 -Q queue1
$ celery -A my_app worker -l info -c 1 -n my_worker2 -Q queue2
This will start two workers which executes one task at a time. But here you have route the tasks accordingly.
celery_app.send_task('tasks.test1', args=[self.id], kwargs={}, queue='queue1')
celery_app.send_task('tasks.test2', args=[self.id], kwargs={}, queue='queue2')
4. Single worker - All Queues
$ celery -A my_app worker -l info -n my_worker1
If you don't mention any queue, it will consume from all queues by default.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With