Python 延迟重新启动烧瓶应用程序
我有一个烧瓶应用程序,其中这是我的main.pyPython 延迟重新启动烧瓶应用程序,python,flask,Python,Flask,我有一个烧瓶应用程序,其中这是我的main.py from king_slayer.database import init_db, manager from king_slayer.views import fetch_production if __name__ == '__main__': init_db() manager.run() 在执行manager.run()之前,我想调用 fetch_production() 所以我做了这个 from king_slaye
from king_slayer.database import init_db, manager
from king_slayer.views import fetch_production
if __name__ == '__main__':
init_db()
manager.run()
在执行manager.run()
之前,我想调用
fetch_production()
所以我做了这个
from king_slayer.database import init_db, manager
from king_slayer.views import fetch_production
if __name__ == '__main__':
init_db()
with manager.app.test_request_context():
fetch_production()
manager.run()
它起作用了。问题是,当我关闭
Flask
应用程序,然后重新启动它时,它会在60-120秒内无法启动。没有错误,什么都没有。浏览器无法加载任何内容。出现一个简单的“加载问题页面”,过了一段时间,它就会正常工作,除非我再次重新启动Flask
app
如果我删除
with manager.app.test_request_context():
fetch_production()
延迟没有发生
p.S
如果我不对manager.app.test\u request\u context()使用:
Flask抛出此错误
Traceback (most recent call last):
File "main.py", line 8, in <module>
fetch_production()
File "/home/jarvis/Development/kingslayer/king_slayer/king_slayer/views.py", line 156, in fetch_production
results={"msg": "Database Updated", }
File "/home/jarvis/Development/kingslayer/local/lib/python2.7/site-packages/flask/json.py", line 235, in jsonify
and not request.is_xhr:
File "/home/jarvis/Development/kingslayer/local/lib/python2.7/site-packages/werkzeug/local.py", line 338, in __getattr__
return getattr(self._get_current_object(), name)
File "/home/jarvis/Development/kingslayer/local/lib/python2.7/site-packages/werkzeug/local.py", line 297, in _get_current_object
return self.__local()
File "/home/jarvis/Development/kingslayer/local/lib/python2.7/site-packages/flask/globals.py", line 20, in _lookup_req_object
raise RuntimeError('working outside of request context')
RuntimeError: working outside of request context
进行一些函数调用,这些函数是在views.py
中定义的,然后在文件系统中创建一个.ini
文件。最后返回一个return jsonify
requests.get(config.SERVER, auth=HTTPBasicAuth(config.AUTH_USER, config.AUTH_PASSWORD))
实际上速度非常快,如果手动调用
fetch\u production()
,所需时间不会超过几毫秒。fetch\u production()的作用是什么?在不确切知道fetch\u production()
的情况下,我猜这是某种阻止动作,然后阻止了对init\u db()的后续调用吗
尝试重新启动应用程序后。默认情况下,烧瓶(调用)是单线程的。当您尝试在另一个请求的上下文中使用requests
向应用程序提供服务的端点发出请求时,服务器无法处理内部请求,直到外部请求完成,因此它最终会死锁。
requests.get(config.SERVER, auth=HTTPBasicAuth(config.AUTH_USER, config.AUTH_PASSWORD))