我使用带有长时间运行的工作进程的 Flask 应用程序,并且此过程看不到数据库中的更改。
main.py
在此文件中,我创建了 Flask 应用程序并开始该过程。
from paas.app_factory import create_app()
app = create_app()
from .controllers.resource_controller import *
from .worker import create_resource, delete_resource
from multiprocessing import Process
from flask import current_app
with app.app_context():
create_proc = Process(target=create_resource, args=(current_app._get_current_object(),)).start()
worker.py
worker每20秒检查一次数据库中是否出现了新资源,如果是,它将处理它们
def create_resources(app):
with app.app_context():
while True:
resource = get_resource_to_create()
if not resource:
print("Wait for resource to create...")
time.sleep(20)
continue
create_resource.....
resource_controller.py
应用程序启动后,我向数据库添加了一些资源。问题是,通过第二条路由,我可以从数据库获取资源,但 worker.py 数据库中看不到任何东西。
from .main import app
@app.route('resource/<resource>', method=POST)
create_resource():
write_resource_to_db(resource)
@app.route('resources')
get_resources():
select_all_resources_from_db()
我相信我这边对应用程序上下文有一些误解,但我无法弄清楚。帮助会非常好。
提前谢谢你。
附言假设get_resource_to_create()
和select_all_resources_from_db()
内部是相同的功能。
问题出在
def create_resources(app):
with app.app_context():
while True:
循环在一个事务中位于应用程序上下文 == 中,因此它的工作方式如下:
START TRANSACTION;
SELECT ...;
SELECT ...;
SELECT ...;
...
所以没有机会获得新的数据。
如果我切换线路,
def create_resources(app):
while True:
with app.app_context():
然后,在一个周期结束后,有一个带有新数据的提交和新事务。
START TRANSACTION;
SELECT ... ;
COMMIT;
START TRANSACTION;
SELECT ... ;
COMMIT;
...