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

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

WBOY
Libérer: 2023-05-15 11:34:06
avant
1504 Les gens l'ont consulté

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
Copier après la connexion

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

[uwsgi]
# 进程个数
workers=1
Copier après la connexion

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:
        //定时任务方法
Copier après la connexion

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
Copier après la connexion

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

[uwsgi]
mule = package包名/__init__.py
Copier après la connexion

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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal