有机化学、化学信息学、生物化学、生物信息学、机器学习、深度学习、药物设计、网站建设关注我!Bilibili
比如一个任务完成需要10分钟,设备仅支持同时运行2个任务,这样第三个任务进行,如果不写异步,就会卡死!
现在通过组合这两个,就能自动进行任务排队。
pip install celery
pip install django-celery-beat
pip install django-celery-results
pip install redis
pip install django-redis在环境内安装这些包
在django项目的settings中,写一些配置内容:
# 设置redi后端缓存
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}
# 在这里注册
INSTALLED_APPS = [
    # ——— Django 内置 Apps ———
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # ——— 你的自定义 App(必须在 drf-tus 之前) ———
    'appchemnote',
    'appuser',
    # ——— 第三方库 ———
    'celery',
    'django_celery_beat',
    'django_celery_results',
    'django.contrib.postgres',
]
# 下面配置详细的信息
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'  # 消息代理地址
CELERY_RESULT_BACKEND = 'django-db'  # 使用 Django 数据库作为结果后端  安装完成后记得迁移一下
CELERY_WORKER_CONCURRENCY = 2  # Worker并发数量,一般默认CPU核数,可以不设置
CELERYD_FORCE_EXECV = True  # 非常重要,有些情况下可以防止死锁
CELERY_WORKER_MAX_TASKS_PER_CHILD = 100  # celery 的 worker 执行多少个任务后进行重启操作
CELERY_TASK_TRACK_STARTED = True  # 设置任务更新状态:启用后,任务开始执行时,状态会从 "PENDING" 更新为 "STARTED"
# CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24  # 任务结果过期时间,秒  设置为0表示不过期
CELERY_TASK_RESULT_EXPIRES = 0  # 任务结果过期时间,秒  设置为0表示不过期
CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True  # 断开重新连接
CELERY_BROKER_CONNECTION_MAX_RETRIES = 10  # 默认重新连接 100 次
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Shanghai'               # 可选:设置时区对于celery,需要写一个整体入口
在项目的settings目录内,新建一个celery.py文件
注意,其中的项目名称需要修改!!!---根据自己的项目定
import os
from celery import Celery
from celery.schedules import crontab
# 设置环境变量--获取django自带的,否则aiochemserver.settings.dev
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'aiochemserver.settings')
# 实例化,需要改成自己的项目名称
app = Celery('aiochemserver')
# 从 Django settings 中加载 Celery 配置
app.config_from_object('django.conf:settings', namespace='CELERY')
# 调度器,自动执行某些任务(比如清理验证码、临时图片等)
app.conf.beat_schedule = {}
# 自动发现任务
app.autodiscover_tasks()
@app.task(bind=True, ignore_result=True)
def debug_task(self):
    print(f'Request: {self.request!r}')
然后需要在项目内的__init__.py内,注册这个celery:
注意,这个文件是settings.py同级内的那个,如果你做了生产和开发环境的分割,不要搞混了(别写在settings文件夹内的那个文件内)
from .celery import app as celery_app
__all__ = ('celery_app',)对于每个异步任务,需要在对应的app内,新建一个tasks.py,在里面写需要异步的任务:
from celery import shared_task
@shared_task(bind=True, soft_time_limit=600)  # 10分钟超时
def save_note(self):
  print('这里进行耗时的任务')关于异步的状态和自动向前端回复任务状态和进度,使用channels进行ws通信,看另一篇文章:
没有推荐的文章...
没有对应的文章...