V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
xuqiccr
V2EX  ›  Python

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

  •  
  •   xuqiccr · 1 天前 · 981 次点击

    ​ 小弟在使用 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 条附言  ·  1 天前
    Python3.6.10, Django2.2.4 ,Django-Q1.3.9 ,系统是 CentOS7
    17 条回复    2025-01-09 15:01:54 +08:00
    makerbi
        1
    makerbi  
       1 天前
    xuqiccr
        2
    xuqiccr  
    OP
       1 天前 via iPhone
    @makerbi 是老版本,因为项目的 Django 还是 2.164 ,q2 不支持
    OrenZ
        3
    OrenZ  
       1 天前
    为什么不用 Celery
    lanweizhujiao
        4
    lanweizhujiao  
       1 天前
    确实 为啥不用 celery
    wenqiang1208
        5
    wenqiang1208  
       1 天前   ❤️ 1
    workers 配置 4 或者 8 之类的,queue_limit 配置 20, timeout 配置 60s 或者不配置
    参考官方文档中的说明,
    报错的原因:任务太多,django-q 的 worker 处理不过来

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

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

    嗯嗯,好的,谢谢大哥
    xuqiccr
        17
    xuqiccr  
    OP
       12 小时 51 分钟前
    @freakxx #14 Windows 需要用 eventlet 或者 gevent 取代 worker_pool 的配置
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1042 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:52 · PVG 03:52 · LAX 11:52 · JFK 14:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.