背景:需要执行耗时脚本,使用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
以上便能够使用多个队列处理任务。