你好,我已经构建了一个 Flask 网站,并使用 uWSGI 进行了部署。
除了使用 apscheduler 运行的数据库更新代码之外,一切似乎都按预期工作。
我有一个对象,它本质上包含一些数据字典,我想使用 apscheduler 每小时更新一次。
当我尝试正常访问该对象时,一切都按预期进行。但是,当我尝试将对象与 apschedulerBackgroundScheduler 一起使用时,该对象不包含任何数据,即使它位于同一内存位置!
当在烧瓶页面中执行时,它会产生:
hex id of object: 0x7f58a5e88a60
hex id of object.prices: 0x7f58a5e88ac0
hex id of object.prices._content_dict: 0x7f58ab0a8180
_content_dict: {625: (12925714.285714285, 9044000.0), 34: (8.528115645081806, 8.0), 35: (13.499491140271743, 35.0), 36: (109.86576894948205, 113.1), 37: (37.98743083746043, 42.64), 38: (1311.6629430032253, 1225.0), 39: (1347.7675049393822, 1354.0), 40: (808.3051410710929, 787.0)}
type: <class 'app.EVE_interfaces.EVE_ESI_interface.ESI_data_obj'>
prices length: 8
然而,当由 apscheduler 作业调用时,它会给出:
hex id of object: 0x7f58a5e88a60
hex id of object.prices: 0x7f58a5e88ac0
hex id of object.prices._content_dict: 0x7f58ab0a8180
_content_dict: {}
type: <class 'app.EVE_interfaces.EVE_ESI_interface.ESI_data_obj'>
prices length: 0
这里对象的内存位置与以前相同!但是当调度程序调用时_content_dict 包含一个空字典?(数据不会被删除,因为当我之后再次正常调用它时它仍然存在。)
当我使用 Flask 的内置开发服务器时,apscheduler 更新功能工作正常,但不适用于 uWSGI。
apscheduler 配置如下:
# run update once at the start
update()
# set up scheduler to repeatedly update ESI data
scheduler = BackgroundScheduler()
scheduler.add_job(func=update, trigger='interval', minutes=_ESI_update_interval)
scheduler.start()
# Shut down the scheduler when exiting the app
atexit.register(lambda: scheduler.shutdown())
我的uWSGI.ini如下:
[uwsgi]
module = main:flask_app
master = true
processes = 1
enable-threads = true
single-interpreter = true
socket = web_app.sock
chmod-socket = 660
vacuum = true
die-on-term = true
logto = /home/mainuser/web_app/uwsgi_logs/%n.log
有人可以解释为什么当使用 apscheduler 调用数据时,数据不存在吗?即使对象内存位置相同?
或者我应该如何运行每小时数据库更新功能?
慕仙森
相关分类