Maison  >  Article  >  Opération et maintenance  >  Comment implémenter les tâches planifiées Django+Nginx+uWSGI

Comment implémenter les tâches planifiées Django+Nginx+uWSGI

WBOY
WBOYavant
2023-05-15 11:34:061494parcourir

Résumé

Lorsque Nginx et uWSGI n'ont pas été configurés, j'utilise apscheduler pour configurer les tâches planifiées dans url.py uniquement, et j'utilise le serveur d'exécution python manage.py, et il fonctionne normalement mais une fois la configuration de uWSGI terminée, l'entrée passe de manage.py à uwsgi .py, ce qui entraîne le chargement de la tâche planifiée apscheduler de url.py uniquement après l'accès de l'utilisateur, et la même tâche planifiée est démarrée à plusieurs reprises avec le nombre de visites de l'utilisateur.

Utilisez le cron d'uWSGI

Méthode 1 : migrez la tâche planifiée apscheduler de url.py vers uwgsi.py

Méthode 2 : utilisez le cron d'uWSGI

Le site officiel du cron de uWSGI : https://uwsgi-docs-zh readthedocs.io. /zh_CN/latest/Cron.html

end=1
while end:
    try:
        import uwsgi
        //建立job_id为0,每天12:12启动fuc的定时器,-1代表*(全部)
        uwsgi.register_signal(0, "", fuc)
        uwsgi.add_cron(0, 12,12,-1,-1,-1)
        end=0
    except:
        pass

La première ou la deuxième méthode nécessite de définir worker=1 sur uwsgi.ini

[uwsgi]
# 进程个数
workers=1

Utiliser socket.bind lock

Cron utilisant uWSGI est limité à l'utilisation d'un seul processus, si plusieurs processus le feront Si le minuteur démarre à plusieurs reprises, vous pouvez utiliser le verrouillage socket.bind pour modifier la tâche planifiée.

    try:
        import socket
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.bind(("127.0.0.1", 47200))
    except socket.error:
        logger.info('禁止成功')
    else:
        //定时任务方法

Il y a un problème. Il peut être possible d'obtenir sock.bind(("127.0.0.1", 47200)) en même temps, ce qui peut atténuer le problème de duplication mais ne peut pas être complètement résolu.

Utilisez mule de uWSGI

Étape 1 : créez un nouveau package et écrivez __init__.py

//如果是Django项目,需要加上才可以使用django的model
//import django
//os.environ.setdefault('DJANGO_SETTINGS_MODULE', '项目名.settings')
//django.setup()

from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
//scheduler.add_job不详说,具体看官网文档
scheduler.add_job(...,timezone='Asia/Shanghai')
scheduler.start()
try:
    import uwsgi
    while True:
        sig = uwsgi.signal_wait()
except Exception as err:
    pass

Étape 2 : configurez uwsgi.ini et ajoutez mule = package package name/init.py

[uwsgi]
mule = package包名/__init__.py

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer