2014-08-29 37 views
4

我正在當地環境中測試芹菜。我的Python文件有以下兩行代碼:與芹菜同時執行兩項任務

​​

看着控制檯輸出,他們似乎依次執行一個接一個。但test2只在test1完成後才運行。至少這是它看起來在讀取控制檯輸出的方式。

這些任務有互相沒有依賴關係所以我不希望有一個任務在移到下一行之前等待另一個任務完成。

如何在同一時間執行兩項任務?

---- **** ----- 
--- * *** * -- 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 
+0

http://stackoverflow.com/questions/15307609/django-celery-running-only-two-tasks-at-once – ndpu 2014-08-29 15:04:52

+0

@ndpu所以它的併發問題?我不需要在這裏使用並行任務? – Prometheus 2014-08-29 15:07:59

+0

它啓動時說我有「併發性:4(prefork)」 – Prometheus 2014-08-29 15:10:01

回答

8

有多種方法可以實現這一點。

1. Single Worker - Single Queue。

$ celery -A my_app worker -l info -c 2 -n my_worker 

這將啓動其在同一時間執行兩個任務工人。

2.多個工人 - 單一隊列。

$ celery -A my_app worker -l info -c 1 -n my_worker1 
$ celery -A my_app worker -l info -c 1 -n my_worker2 

這將啓動兩個工人一次執行一個任務。注意這兩個任務都在同一個隊列中。

3.多個工人 - 多個隊列。

$ 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 

這將啓動兩個工人一次執行一個任務。 但是,在這裏你已經有相應的任務路線。

celery_app.send_task('tasks.test1', args=[self.id], kwargs={}, queue='queue1') 
celery_app.send_task('tasks.test2', args=[self.id], kwargs={}, queue='queue2') 
1

呼叫與--autoscale選項工人這將根據需要放大和縮小的過程。

--autoscale AUTOSCALE 
         Enable autoscaling by providing max_concurrency, 
         min_concurrency. Example:: --autoscale=10,3 (always 
         keep 3 processes, but grow to 10 if necessary) 

示例。

celery -A sandbox worker --autoscale=10,0 --loglevel=info