Django+Nginx+uWSGI定時(shí)任務(wù)怎么實(shí)現(xiàn)

摘要

nginx和uwsgi還沒配置時(shí),單獨(dú)在url.py使用apscheduler設(shè)置定時(shí)任務(wù),使用python manage.py run server,運(yùn)行正常;但是在配置完成uwsgi后,入口從manage.py變?yōu)閡wsgi.py,導(dǎo)致需要用戶訪問后才能加載url.py的apscheduler定時(shí)任務(wù),并且隨用戶訪問次數(shù),同一定時(shí)任務(wù)重復(fù)啟動(dòng)。

使用uWSGI的cron

方法一:將url.py的apscheduler定時(shí)任務(wù)遷移到uwgsi.py

方法二:使用 uWSGI的cron

uWSGI的cron官網(wǎng) : https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/Cron.html

end=1 while?end: ????try: ????????import?uwsgi ????????//建立job_id為0,每天12:12啟動(dòng)fuc的定時(shí)器,-1代表*(全部) ????????uwsgi.register_signal(0,?"",?fuc) ????????uwsgi.add_cron(0,?12,12,-1,-1,-1) ????????end=0 ????except: ????????pass

方法一或方法二都需要設(shè)置uwsgi.ini的worker=1

[uwsgi] #?進(jìn)程個(gè)數(shù) workers=1

使用socket.bind鎖

使用uWSGI的cron只限于單進(jìn)程情況下使用,如果多進(jìn)程會(huì)導(dǎo)致定時(shí)器重復(fù)啟動(dòng)問題,可以使用socket.bind鎖改造定時(shí)任務(wù)。

????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: ????????//定時(shí)任務(wù)方法

存在問題,可能存在同時(shí)獲取 sock.bind((“127.0.0.1”, 47200)),能夠減緩重復(fù)問題,不能完全解決。

使用uWSGI的mule

第一步:新建一個(gè)Package,編寫__init__.py

//如果是Django項(xiàng)目,需要加上才可以使用django的model //import?django //os.environ.setdefault('DJANGO_SETTINGS_MODULE',?'項(xiàng)目名.settings') //django.setup()  from?apscheduler.schedulers.background?import?BackgroundScheduler scheduler?=?BackgroundScheduler() //scheduler.add_job不詳說,具體看官網(wǎng)文檔 scheduler.add_job(...,timezone='Asia/Shanghai') scheduler.start() try: ????import?uwsgi ????while?True: ????????sig?=?uwsgi.signal_wait() except?Exception?as?err: ????pass

第二步:設(shè)置uwsgi.ini,增加mule = package包名/init.py

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

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊6 分享