django-q2 使用多队列

背景:需要执行耗时脚本,使用django orm,因此选用django-q2而不是celery。
1.安装
pip install django-q2
2. settings.py配置

Q_CLUSTER = {
    'name': 'DjangORM',
    'workers': 1,
    'recycle': 100,  # 定期回收资源
    'ack_failures': True,
    # 'max_rss': 1024*1024*5,  # 最大内存限制
    'compress': True,  # 压缩
    'bulk': 1,
    'orm': 'default',
    'ALT_CLUSTERS': {
        'long': {
            'timeout': 2000,
            'retry': 2010,
            'max_attempts': 1,
            'queue_limit': 1,
            'compress': True,  # 压缩
        },
        'short': {
            'timeout': 150,
            'retry': 160,
            'max_attempts': 2,
            'queue_limit': 4,  # 设置后会将队列中的任务读到内存中,等待执行。不宜过大
        }
    }
}

这里使用的是同一台服务器,但是不同的数据使用不同的队列,大数据使用long队列。
worker设置为1的原因:如果有多个worker,队列有多个任务,会出现重复执行同一个任务的情况,导致队列任务一直卡着。

3.异步任务 task.py

def process_data(in_file, out_dir, *args, **kwargs):
    """
    投递给 django-q ,使用户可以在 admin 页面查看状态
    使用命令 :python prepare_data.py SPF_cecum_annotation.h5ad --out outp --proj HLMA
    """
    # 判断输入文件大小
    # 根据文件大小,选择不同的队列 file_size 小于1,选择short,其他选择long。
    # 名称需与Q_CLUSTER配置一致
    if file_size < 1:
        cluster = 'short'
    else:
        cluster = 'long'
    tid = async_task('subprocess.run', ['python', '***.py', in_file, '--out', out_dir],
                     task_name='****', # 可随便填
                     stdout=subprocess.PIPE,
                     stderr=subprocess.PIPE, 
                     cluster=cluster)
 else:
     tid = uuid.uuid4()
 return tid

3.控制台启动qcluster

# linux
Q_CLUSTER_NAME=long python manage.py qcluster
Q_CLUSTER_NAME=short python manage.py qcluster

以上便能够使用多个队列处理任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值