假设程序以下:flask
1 if __name__ == '__main__': 2 t = Thread(target=test) 3 t.start() 4 app.run(host='0.0.0.0',port=8080,debug=False)
gunicorn在启动过程只会从flask的app文件中取出app使用,并不会执行main函数,若是但愿在gunicorn中仍旧能启动后台线程并保证后台线程不由于gunicorn的子进程重复执行,有三种方式。app
1. 使用gunicorn的preload参数。在worker进程被复制(派生)以前载入应用的代码。这种方式,线程执行代码须要写在app文件的全局部分,利用预加载只执行一下。函数
2. 使用flask的app的钩子函数before_first_request。在before_first_request中执行线程。但这种方式必需要有第一个请求才能触发线程启动。spa
3. 使用文件锁。这种方式与第一种方式相同,须要把线程执行的代码写在app文件的全局部分。在第一个子进程启动时建立文件并加锁,在后续的子进程启动时判断锁的状态,若是有锁则不执行。线程
以上经过奇怪的操做启动后台线程。但不推荐。能够考虑使用celery或者cron等方式实现需求。debug