小弟在使用 Django-Q 的时候发现建了 100 个任务,但是 q_cluster 只会执行前几十个任务,后面的任务会在队列中一直到 timeout 结束,但是看进程 q_cluster 的进程又是一直存在,头秃,不知道有大佬可以指点一下吗?
我的 settings:
# djangoQ 配置
Q_CLUSTER = {
'name': 'myDjangoQ', # 启动服务名
'workers': 2, # 多少个 workers 的数量直接影响了任务处理的并发能力
'label': 'myDjangoQ_label',
'orm': 'default', # 使用 Django ORM 作为后端
# 'recycle': 4, # 工作进程在处理完指定数量的任务后,将自动重启自身以释放内存资源
'timeout': 10, # 超时
# 'recycle_frequency': 4, # 重启频率
'compress': False, # 是否将任务包压缩后发送到代理
'save_limit': 250, # 保存成功任务结果
'sync': False, # 是否同步执行任务
'queue_limit': 2, # 集群中的任务数量
'cpu_affinity': 1, # 单个任务使用 cpu 核心
"redis": {
"host": config.get("redis", 'host'),
"port": config.get("redis", 'port'),
"db": 3,
"password": config.get("redis", 'password'),
"socket_timeout": 30,
"charset": "utf-8",
"decode_responses": True,
"max_connections": 1000,
}
}
触发函数和具体执行函数:
def test(request):
from django_q.tasks import async_task, result
info = {'code': 0, 'data': [], 'msg': ''}
try:
task_ids = []
for i in range(700):
task_id = async_task(my_function, i)
task_ids.append(task_id)
except:
info['msg'] = 'test error'
logger.error(traceback.format_exc())
return JsonResponse(info, safe=False)
def my_function(i):
logger.info('i:{} 开始开始开始开始开始'.format(i))
logger.info('i:{} 开始'.format(i))
time.sleep(random.randint(3, 5))
logger.info('i:{} 结束'.format(i))
return i
实际输出:
11:15:31 [Q] INFO Process-1:1 processing [undress-hot-october-high]
2025-01-08 11:15:31.602 | INFO | deploy_queue.views:my_function:1637 - i:20 开始开始开始开始开始
2025-01-08 11:15:31.602 | INFO | deploy_queue.views:my_function:1643 - i:20 开始
2025-01-08 11:15:31.610 | INFO | deploy_queue.views:my_function:1645 - i:19 结束
11:15:31 [Q] INFO Process-1:2 processing [network-pizza-sink-emma]
2025-01-08 11:15:31.611 | INFO | deploy_queue.views:my_function:1637 - i:21 开始开始开始开始开始
2025-01-08 11:15:31.611 | INFO | deploy_queue.views:my_function:1643 - i:21 开始
11:15:31 [Q] INFO Processed [tennessee-sierra-timing-michigan]
11:15:31 [Q] INFO Processed [arkansas-muppet-charlie-orange]
2025-01-08 11:15:35.615 | INFO | deploy_queue.views:my_function:1645 - i:21 结束
2025-01-08 11:15:36.607 | INFO | deploy_queue.views:my_function:1645 - i:20 结束
11:15:41 [Q] WARNING reincarnated worker Process-1:1 after timeout
11:15:41 [Q] INFO Process-1:5 ready for work at 30020
11:15:41 [Q] INFO Process-1:5 processing [zulu-october-green-berlin]
2025-01-08 11:15:41.873 | INFO | deploy_queue.views:my_function:1637 - i:22 开始开始开始开始开始
11:15:42 [Q] WARNING reincarnated worker Process-1:2 after timeout
可以看到前面 21 个任务执行正常,但是第 22 个开始就全是 timeout 退出,完全没什么头绪,令人头大。
1
makerbi 18 小时 37 分钟前
|
3
OrenZ 15 小时 42 分钟前
为什么不用 Celery
|
4
lanweizhujiao 13 小时 50 分钟前
确实 为啥不用 celery
|
5
wenqiang1208 12 小时 32 分钟前 1
workers 配置 4 或者 8 之类的,queue_limit 配置 20, timeout 配置 60s 或者不配置
参考官方文档中的说明, 报错的原因:任务太多,django-q 的 worker 处理不过来 可以看看源码,代码量很少不到 500 |
6
freakxx 12 小时 15 分钟前
|
7
tpopen 11 小时 49 分钟前
超时才 10 ? 是不是时间太短了?我看是 31 开始到 41 刚好 10 就超时了。
|
8
qW7bo2FbzbC0 11 小时 45 分钟前 1
当年用过,最后自己选择自己手写一个调度器,需求简单,即使 django-q 对我来说也算笨重了
|
10
xuqiccr OP @wenqiang1208 居然是因为任务太多,我以为他会全放队列里然后按 workers 数量依次拿出来,是我想当然了
|
11
xuqiccr OP |