django后台定时程序

1.django工程分app里面开一个副线程,启动背后程序

(1)在app里面写好定时程序:

D:\WorkSpaces\rmpa-2024-5\server\app_pressure\proce\analy.py:

def fun_analy_pressdata():
    '''
    定时函数
    :return:
    '''
    # obj_guide = TAnalyGuide()
    # obj_guide.fun_init()
       
    while True:
        print('dd',datetime.datetime.now())
        time.sleep(6)
   

(2)在apps.py做好线程分配,当工程启动后,改线程在背后进行

D:\WorkSpaces\rmpa-2024-5\server\app_pressure\apps.py:


from django.apps import AppConfig
import threading

class AppPressureConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'app_pressure'

    
    def ready(self):
        print('启动程序')
        # 启动线程
        from app_pressure.proce.analy import fun_analy_pressdata  # 将导入语句放在函数内部

        thread1 = threading.Thread(target=fun_analy_pressdata)
        thread1.daemon = True  # 守护线程,主线程结束后,子线程也结束
        thread1.start()

  

(3)直接启动:python manage.py runserver 0.0.0.0:8000

我想在Django服务器启动时执行一些代码,但我希望它只运行一次。目前,当我启动服务器时,它会被执行两次。

(django2) D:\WorkSpaces\rmpa-2024-5\server>python manage.py runserver 0.0.0.0:8000
===============install pymysql==============
启动程序
dd 2024-04-25 21:57:14.956299
===============install pymysql==============
启动程序
dd 2024-04-25 21:57:15.488642
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
April 25, 2024 - 21:57:16
Django version 3.2.11, using settings 'server.settings'
Starting development server at http://127.0.0.1:8103/
Quit the server with CTRL-BREAK.

dd 2024-04-25 21:57:20.958007
dd 2024-04-25 21:57:21.495500

2.如何避免AppConfig.ready()方法在Django中运行两次——“--noreload”

使用python manage.py runserver Django启动两个进程,一个用于实际的开发服务器,另一个用于在代码更改时重新加载应用程序。

您还可以在不使用reload选项的情况下启动服务器,并且只会看到一个正在运行的进程只执行一次:

(django2) D:\WorkSpaces\rmpa-2024-5\server>python manage.py runserver 0.0.0.0:8103 --noreload
===============install pymysql==============
启动程序
dd 2024-04-25 22:02:00.119570

Performing system checks...
System check identified no issues (0 silenced).
April 25, 2024 - 22:02:01
Django version 3.2.11, using settings 'server.settings'
Starting development server at http://0.0.0.0:8103/    
Quit the server with CTRL-BREAK.

dd 2024-04-25 22:02:06.131818

dd 2024-04-25 22:02:12.140733

可是这样http://0.0.0.0:8103/ 主进程打不开

3.识别出哪个进程是关键——'RUN_MAIN'

Django中我们可能需要在启动时做某些初始化的动作,通过python manager.py runserver 0:8000命令来启动Django开发环境时,实际上Django启动了两次。第一次启动一个auto-reloader,第二次才是启动真正的应用。

D:\WorkSpaces\rmpa-2024-5\server\app_pressure\apps.py:

from django.apps import AppConfig
import threading

class AppPressureConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'app_pressure'

    def ready(self):
        if os.environ.get('RUN_MAIN'):
            print('启动程序')
            from app_pressure.proce.analy import fun_analy_pressdata  # 将导入语句放在函数内部
            thread1 = threading.Thread(target=fun_analy_pressdata)
            thread1.daemon = True  # 守护线程,主线程结束后,子线程也结束
            thread1.start()
            
C:\Users\lenovo\Env\django2\Scripts\python.exe D:\WorkSpaces\rmpa-2024-5\server\manage.py runserver 8103 
===============install pymysql==============
===============install pymysql==============
启动程序

dd 2024-04-25 22:25:32.836641

Performing system checks...
Watching for file changes with StatReloader
System check identified no issues (0 silenced).
April 25, 2024 - 22:25:34
Django version 3.2.11, using settings 'server.settings'
Starting development server at http://127.0.0.1:8103/
Quit the server with CTRL-BREAK.
[25/Apr/2024 22:25:36] "GET / HTTP/1.1" 200 5564

dd 2024-04-25 22:25:38.842461

dd 2024-04-25 22:25:44.850644

完美!!!

posted @   德琪  阅读(107)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2023-04-26 【电脑删不掉文件或文件夹】
点击右上角即可分享
微信分享提示