
小弟在使用 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 345 天前 |
3 55wHD3PbDHiewGz1 345 天前 为什么不用 Celery |
4 lanweizhujiao 345 天前 确实 为啥不用 celery |
5 wenqiang1208 345 天前 workers 配置 4 或者 8 之类的,queue_limit 配置 20, timeout 配置 60s 或者不配置 参考官方文档中的说明, 报错的原因:任务太多,django-q 的 worker 处理不过来 可以看看源码,代码量很少不到 500 |
6 metamask 345 天前 |
7 tpopen 345 天前 超时才 10 ? 是不是时间太短了?我看是 31 开始到 41 刚好 10 就超时了。 |
8 qW7bo2FbzbC0 345 天前 当年用过,最后自己选择自己手写一个调度器,需求简单,即使 django-q 对我来说也算笨重了 |
10 79lawyer OP @wenqiang1208 居然是因为任务太多,我以为他会全放队列里然后按 workers 数量依次拿出来,是我想当然了 |
11 79lawyer OP |
12 55wHD3PbDHiewGz1 345 天前 @freakxx Celery 支持的啊,我最开始就用的 Windows ,可以邮件细聊 b3JlbnpoYW5nQG92aW5jLmNu |
13 w0017 344 天前 自己写一个,又不是多复杂的业务。 |
14 metamask 344 天前 @OrenZ #12 是的哇,好几年没写 py win 这种, 我记得一开始用的也是 celery ,在后台编排任务 > Does Celery support Windows? > Answer: No. > > Since Celery 4.x, Windows is no longer supported due to lack of resources. > > But it may still work and we are happy to accept patches. 看 celery 官方这么说,就想着看大哥们有没 “最佳实践” |
15 55wHD3PbDHiewGz1 344 天前 @freakxx #14 看起来只是不会再单独测试 Windows 兼容性了,可以试着跑一下,我之前用 celery==5.2.2 在 Windows 上是可以正常开发的,不过我的生产环境是在 Linux |