对象不包含数据,但仅在 uWSGI FLASK 应用程序中与 apscheduler 一起使用时

Object does not contain data but ONLY when used with apscheduler in uWSGI FLASK app

你好,我已经建立了一个 Flask 网站,我已经用 uWSGI 部署了它。

一切似乎都按预期工作,除了我的数据库更新代码 运行 使用 apscheduler。

我有一个主要包含一些数据字典的对象,我想使用 apscheduler 每小时更新一次。

当我尝试正常访问该对象时,一切都按预期进行。 但是,当我尝试将该对象与 apscheduler BackgroundScheduler 一起使用时,该对象不包含任何数据,即使它位于相同的内存位置!

产生我的输出的代码是:

def update():
    print("hex id of object: ", hex(id(_ESI_data)))
    print("hex id of object.prices: ", hex(id(_ESI_data.prices)))
    print("hex id of object.prices._content_dict: ", hex(id(_ESI_data.prices._content_dict)))
    print("_content_dict: ", _ESI_data.prices._content_dict)
    print("type: ", type(_ESI_data))
    print('prices length: ', len(_ESI_data.prices))

    ...

在 flask 页面中执行时,它会产生:

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 在被调度程序调用时包含一个空的 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 调用时数据不存在吗?即使对象内存位置相同?

或者我应该如何运行一个每小时数据库更新功能?

我还不确定为什么,但添加:

lazy-apps = true

到 uWSGI.ini 文件,解决了问题