V 币急等感谢---关于 djcelery 配置 queue 不生效 [也谈 workflow 子任务锁死问题]

2018-09-27 20:49:11 +08:00
 akmonde

我 celery 版本为 v3.1.25 ,django 和 celery 的启动项如下:

celery -A proj-test worker -n workerA.%h --concurrency=2
celery -A proj-test worker -n workerB.%h --concurrency=2
python manage.py celeryd -B
python manage.py celery beat
python manage.py runserver 0.0.0.0:8000

这样是可以运行的,不过好像由于我在 celery 的 task 里面,使用了 workflow 的 chord/group 进行 subtask 分发,导致 subtask 过多时,因为 concurrency 有限,beat 任务( beat_function )会因此堵塞结束不掉。

大概代码如下,下面至少有两个 chord:

@task
def beat_function():
	xxfunc1.delay()
    xxfunc2.delay()
	time.sleep(5)
    chord((test1.s(x) for x in xs) , test2.s())
    chord((test3.s(y) for y in ys) , test4.s())
    

所以我有个问题,想问问大家能否指定 beat 的 queue。

让它不会占用其他 subtask 运行的 worker 容量,这样就算 beat 所在的 queue 在阻塞,等到 subtask 运行完毕,这边 queue 也会结束相应的 beat 任务。

我是这样弄得,queue 配置如下:

CELERY_QUEUES = {
    "celery_beat": { 
        "exchange": "celery_beat",
        "exchange_type": "direct",
        "routing_key": "celery_beat"
    },
}

尝试过的 beat 运行方式如下两种

python manage.py celeryd -B -Q celery_beat

也尝试了下面的运行法子:

python manage.py celery worker  -B -Q celery_beat

不过始终不能把 beat 任务运行起来,每次一加 queue 似乎 beat 就失效了。

尝试过同时单独运行,也失败:

python manage.py celery worker --beat
python manage.py celery worker -Q celery_beat

希望大佬们,帮忙解答下面两个问题:

我不能每次手动结束 beat 任务,确实结束了能解决某一次死锁,那些 subtask 能运行完。我曾尝试设置任务超时,单个 chord 的时可用,该 chord 可以运行完结,不过后面还有 chord 分发其他子任务就 gg 了,也就是说只能运行完第一个 chord,比如我上面举的例子。

我想要实现的是,单个 queue 指定的那些 worker,运行所有的 beat 任务,现在的情况是所有的 worker 都会去抢 beat 任务,结果可能导致了部分 beat 任务阻塞。

1649 次点击
所在节点    Python
8 条回复
akmonde
2018-09-28 12:02:32 +08:00
Woc,没人给点建议么,屌大的大佬们呢,都换上女装去泡吧了么?!
YaphetYin
2018-09-29 22:23:22 +08:00
beat 单独起啊,celery -A xxx beat
akmonde
2018-09-30 13:00:29 +08:00
@YaphetYin 单独起了,会出现我上述的死锁问题,所以才想把 beat 任务单独给一个 queue。
但是结果好像不尽如人意,不知道我 router 和 queue 是否配置有问,还是压根不能这样做。
YaphetYin
2018-10-01 04:47:06 +08:00
@akmonde
call subtask 的时候不要同步 call,官方有针对死锁的说明
akmonde
2018-10-01 11:33:56 +08:00
@YaphetYin 有看过,3.2 以后好像还针对这种情况抛出错误,只是实在没想到更优的解法,来解决一堆 subtask 的问题。
YaphetYin
2018-10-01 12:20:44 +08:00
@akmonde 可以把你的任务结构贴一下看看?
akmonde
2018-10-01 17:53:31 +08:00
@YaphetYin 嗯,回头我整理下贴出来,代码在公司,兄 dei 长假快乐~
akmonde
2018-10-09 13:57:33 +08:00
@YaphetYin 后来用单个 chord 串联了执行了一堆任务,暂时解决了,虽然法子有点笨,老兄回头有空看看我最新的提问...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/493305

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX