我在 Flask 和 uWSGI 上有一个应用程序,在 SQLite 中有一个作业存储。我随应用程序一起启动调度程序,并在访问某些 url 时通过
add_task
添加新任务。
我看到任务已正确保存在作业库中,我可以通过API查看它们,但它没有在指定时间执行。
一些重要数据:
uwsgi.ini
processes = 1
enable-threads = true
__init__.py
scheduler = APScheduler()
scheduler.init_app(app)
with app.app_context():
scheduler.start()
main.py
scheduler.add_job(
id='{}{}'.format(test.id, g.user.id),
func = pay_day,
args = [test.id, g.user.id],
trigger ='interval',
minutes=test.timer
)
在
service.py
def pay_day(tid, uid):
with scheduler.app.app_context():
*some code here*
有趣的行为:如果您通过访问 URL 创建任务并在之后重新启动应用程序,则该任务将被执行。但是,如果应用程序正在运行,并且其中一个用户通过访问 URL 创建任务,则该任务只有在应用程序重新启动后才会完成。 即使在调度程序日志中,我也没有收到任何错误或异常。 我已经不知道如何让它发挥作用以及我做错了什么。我需要提示。
uWSGI 采用了一些禁用全局解释器锁的技巧 随之而来的是对线程操作至关重要的线程的使用 AP调度程序。要解决此问题,您需要使用以下命令重新启用 GIL --启用线程开关。有关更多详细信息,请参阅 uWSGI 文档。
我知道您在 uwsgi.ini 中设置了enable-threads = true,但请尝试使用命令行启用它。