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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章