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 · 18 小时 45 分钟前 · 740 次点击

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

    可以看看源码,代码量很少不到 500
    freakxx
        6
    freakxx  
       12 小时 15 分钟前
    @OrenZ #3
    @lanweizhujiao #4

    大哥们,有 win 好用点的吗,最近在考虑 win 上面跑的任务,发现都不支持
    tpopen
        7
    tpopen  
       11 小时 49 分钟前
    超时才 10 ? 是不是时间太短了?我看是 31 开始到 41 刚好 10 就超时了。
    qW7bo2FbzbC0
        8
    qW7bo2FbzbC0  
       11 小时 45 分钟前   ❤️ 1
    当年用过,最后自己选择自己手写一个调度器,需求简单,即使 django-q 对我来说也算笨重了
    xuqiccr
        9
    xuqiccr  
    OP
       9 小时 54 分钟前
    @tpopen 因为我代码是 sleep3-5 秒就返回,为了测试效率就放到了 10 秒
    xuqiccr
        10
    xuqiccr  
    OP
       9 小时 52 分钟前
    @wenqiang1208 居然是因为任务太多,我以为他会全放队列里然后按 workers 数量依次拿出来,是我想当然了
    xuqiccr
        11
    xuqiccr  
    OP
       9 小时 51 分钟前
    @OrenZ
    @lanweizhujiao
    本来是觉得 celery 配置有点麻烦而且用不上他的定时功能所以选了小点的 Django-Q ,发现这个问题我绕不过去现在已经在用 celery 了
    OrenZ
        12
    OrenZ  
       7 小时 29 分钟前
    @freakxx Celery 支持的啊,我最开始就用的 Windows ,可以邮件细聊 b3JlbnpoYW5nQG92aW5jLmNu
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1024 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:13 · PVG 06:13 · LAX 14:13 · JFK 17:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.