flask celery 多worker指定執行 限制併發同時只有一個執行

原來的代碼裏寫到了一起,就一個worker執行,兩個定時任務異步任務都放到一個隊列,經常阻塞不夠用。
這裏我這樣修改的。
先將定時任務都發到一個隊列。然後定時任務調起來的異步任務是發到不同的隊列的。配置是這樣的。
celery 4.2

# celery
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
app.config['result_backend'] = 'redis://localhost:6379/0'
#這裏的是隊列
CELERY_QUEUES = (
# Queue("default", Exchange("default"), routing_key="default"),
Queue("schedule", Exchange("schedule"), routing_key="schedule"),
Queue("alive", Exchange("alive"), routing_key="alive"),
Queue("replay", Exchange("replay"), routing_key="replay"),
Queue("engine", Exchange("engine"), routing_key="engine")
)
#這裏是任務對應的隊列,相當於是路由
CELERY_ROUTES = {
'tasks.build.schedule': {"queue": "schedule", "routing_key": "schedule"},
'tasks.build.alive': {"queue": "alive", "routing_key": "alive"},
'tasks.build.replay': {"queue": "replay", "routing_key": "replay"},
'tasks.build.engine': {"queue": "engine", "routing_key": "engine"}
}
app.config['task_queues'] = CELERY_QUEUES
app.config['task_routes'] = CELERY_ROUTES

celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)

這裏配置完成後。
定時任務和異步任務就不寫了。
worker怎麼執行呢
這樣:

celery worker -A task.buid -l info -Q  隊列名(例如:alive)

這個worker執行的就是 alive的隊列的任務。
-Q指定隊列。
不同隊列就是不同的執行主機類型,這樣就可以多臺不同類型的執行主機去執行不同的任務。

限制併發
後面遇到了因爲被調用工具的限制,不支持併發。這裏要限制只能一個在執行。
那首先celery是怎麼併發的:
是默認 celery worker 執行後默認會開啓cpu個數個進程來保持多個任務的併發
所以默認執行 worker 看進程會見到好幾個進程一起在運行
這裏限制,我們可以使用 celery worker的 -c 參數 這個-c參數指定的是啓動幾個worker。
及 監聽指定隊列的worker增加參數

celery worker -A task.buid -l info -Q  隊列名(例如:alive) -c 1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章