请教 Python 大佬 Django-Q 的使用问题

1 天前
 xuqiccr

​ 小弟在使用 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 退出,完全没什么头绪,令人头大。

960 次点击
所在节点    Python
17 条回复
makerbi
1 天前
xuqiccr
1 天前
@makerbi 是老版本,因为项目的 Django 还是 2.164 ,q2 不支持
OrenZ
1 天前
为什么不用 Celery
lanweizhujiao
1 天前
确实 为啥不用 celery
wenqiang1208
1 天前
workers 配置 4 或者 8 之类的,queue_limit 配置 20, timeout 配置 60s 或者不配置
参考官方文档中的说明,
报错的原因:任务太多,django-q 的 worker 处理不过来

可以看看源码,代码量很少不到 500
freakxx
1 天前
@OrenZ #3
@lanweizhujiao #4

大哥们,有 win 好用点的吗,最近在考虑 win 上面跑的任务,发现都不支持
tpopen
1 天前
超时才 10 ? 是不是时间太短了?我看是 31 开始到 41 刚好 10 就超时了。
qW7bo2FbzbC0
1 天前
当年用过,最后自己选择自己手写一个调度器,需求简单,即使 django-q 对我来说也算笨重了
xuqiccr
23 小时 44 分钟前
@tpopen 因为我代码是 sleep3-5 秒就返回,为了测试效率就放到了 10 秒
xuqiccr
23 小时 43 分钟前
@wenqiang1208 居然是因为任务太多,我以为他会全放队列里然后按 workers 数量依次拿出来,是我想当然了
xuqiccr
23 小时 41 分钟前
@OrenZ
@lanweizhujiao
本来是觉得 celery 配置有点麻烦而且用不上他的定时功能所以选了小点的 Django-Q ,发现这个问题我绕不过去现在已经在用 celery 了
OrenZ
21 小时 19 分钟前
@freakxx Celery 支持的啊,我最开始就用的 Windows ,可以邮件细聊 b3JlbnpoYW5nQG92aW5jLmNu
w0017
9 小时 23 分钟前
自己写一个,又不是多复杂的业务。
freakxx
6 小时 2 分钟前
@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 官方这么说,就想着看大哥们有没 “最佳实践”
OrenZ
5 小时 56 分钟前
@freakxx #14 看起来只是不会再单独测试 Windows 兼容性了,可以试着跑一下,我之前用 celery==5.2.2 在 Windows 上是可以正常开发的,不过我的生产环境是在 Linux
freakxx
5 小时 51 分钟前
@OrenZ #15

嗯嗯,好的,谢谢大哥
xuqiccr
5 小时 2 分钟前
@freakxx #14 Windows 需要用 eventlet 或者 gevent 取代 worker_pool 的配置

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

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

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

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

© 2021 V2EX