请教 Python 大佬 Django-Q 的使用问题 - V2EX
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
79lawyer
V2EX    Python

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

  •  
  •   79lawyer 345 天前 2343 次点击
    这是一个创建于 345 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    嗯嗯,好的,谢谢大哥
    79lawyer
        17
    79lawyer  
    OP
       344 天前   1
    @freakxx #14 Windows 需要用 eventlet 或者 gevent 取代 worker_pool 的配置
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     966 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 18:47 PVG 02:47 LAX 10:47 JFK 13:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86