前阵子用Django写了个接口服务,使用BlockingScheduler启动了一个定时任务,每天查一遍数据库,本机测试Django时没有任何问题,但是托管给uwsgi发布到服务器时发现分线程的定时任务并没有启动,查了些文档,发现uwsgi默认是one thread one processor,没有请求的时候,进程被挂起,子线程也就被挂起了。解决方案:
uwsgi.ini配置文件中添加
enable-threads = true
问题解决重新发布,发现定时任务是起来了,但是一下子起了N个定时任务。一开始以为是自己的单一实例写的有问题,后来发现的确是服务器启动的时候多次初始化了view.py ,从而多次初始化了view中引用的对象。有人说可以把只需要执行一次的代码放到url.py中去,但是对于我来说,只是把N从8变成了3。最后起作用的解决方法:
在myapp/myapp/wsgi.py文件中
import logging
def startup():
taskPoll = TaskPolling.GetInstance()
startup()
logging.info("django wsgi init")
查看日志,setup只执行了一次,taskPolling的单一实例在这里被保留,即使view多次初始化,定时任务也只启了一个。
网友评论