摘要
在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