Maison > Article > Opération et maintenance > Comment implémenter les tâches planifiées Django+Nginx+uWSGI
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.
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
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.
É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!