python - SQLAlchemyJobstore 在 Flask 应用程序中返回 'TypeError: cannot pickle 'SSLContext' object'
问题描述
在我的代码中实现 SQLAlchemyJobStore 后出现问题。尝试添加作业会导致以下错误:TypeError: cannot pickle 'SSLContext' object。我已经阅读了所有文档并尝试了类似问题提到的所有修复但没有结果(例如https://github.com/agronholm/apscheduler/issues/421)。
我的代码如下:
在views.py中:
@app.before_first_request
def schedule_jobs():
scheduler = BackgroundScheduler(
jobstores={'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')}
)
scheduler.start()
data = Data()
scheduler.add_job(data.schedule_app,
trigger='interval',
hours=int(os.getenv('UPDATE_FREQUENCY')))
在 data.py 中:
class Data:
def __init__(self):
self.ssl_context = ssl.SSLContext()
def __getstate__(self):
state = self.__dict__.copy()
del state['ssl_context']
return state
def __setstate__(self, state):
self.__dict__.update(state)
self.ssl_context = ssl.SSLContext()
def schedule_app(self):
print("Task added Successfully")
我添加了setstate和getstate作为上述修复类似问题的一部分。即使在课堂上只有 schedule_app,我仍然得到相同的结果。
完整的跟踪:
2021-04-03T10:18:48.206620307Z Traceback (most recent call last):
2021-04-03T10:18:48.206623307Z File "/tmp/8d8f6862c98e628/antenv/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
2021-04-03T10:18:48.206626507Z response = self.full_dispatch_request()
2021-04-03T10:18:48.206629507Z File "/tmp/8d8f6862c98e628/antenv/lib/python3.8/site-packages/flask/app.py", line 1945, in full_dispatch_request
2021-04-03T10:18:48.206632707Z self.try_trigger_before_first_request_functions()
2021-04-03T10:18:48.206635807Z File "/tmp/8d8f6862c98e628/antenv/lib/python3.8/site-packages/flask/app.py", line 1993, in try_trigger_before_first_request_functions
2021-04-03T10:18:48.206638907Z func()
2021-04-03T10:18:48.206641807Z File "/tmp/8d8f6862c98e628/app/views.py", line 39, in schedule_jobs
2021-04-03T10:18:48.206644907Z scheduler.add_job(data.schedule_app,
2021-04-03T10:18:48.206647807Z File "/tmp/8d8f6862c98e628/antenv/lib/python3.8/site-packages/apscheduler/schedulers/base.py", line 448, in add_job
2021-04-03T10:18:48.206650907Z self._real_add_job(job, jobstore, replace_existing)
2021-04-03T10:18:48.206653807Z File "/tmp/8d8f6862c98e628/antenv/lib/python3.8/site-packages/apscheduler/schedulers/base.py", line 872, in _real_add_job
2021-04-03T10:18:48.206656907Z store.add_job(job)
2021-04-03T10:18:48.206659807Z File "/tmp/8d8f6862c98e628/antenv/lib/python3.8/site-packages/apscheduler/jobstores/sqlalchemy.py", line 95, in add_job
2021-04-03T10:18:48.206662907Z 'job_state': pickle.dumps(job.__getstate__(), self.pickle_protocol)
2021-04-03T10:18:48.206665907Z TypeError: cannot pickle 'SSLContext' object
有没有办法来解决这个问题?
我使用 SQLAlchemyJobStore 只是为了避免多个实例中的多个工作人员执行计划的作业(我在 Azure 中使用 8 个实例运行此应用程序并遵循 Gunicorn 配置:
gunicorn -w 8 --preload --worker-class gevent
有什么方法可以在不使用 SQLAlchemyJobStore 的情况下实现这一目标?
先感谢您。
解决方案
推荐阅读
- reactjs - 读取 excel 文件时出现问题(fs readFilesync 错误)
- cakephp - 将蛋糕 2 升级到 3
- sql - 当日期字段为空时,我想将其设置为今天的日期
- sas - 输入文本文件,缺少输出日期格式
- python - AttributeError:模块“django.db.models”没有属性“BigAutoField”
- c++ - 窗口 ros visual studio 2017 catkin 出错
- node.js - 如何使用 gulp 创建 foo-example/index.html 而不是 foo-example.html?
- python - 如果使用 xpath 查找元素的 Selenium 语句(包含文本)
- html - 防止图像增加 div 大小?
- ios - 列表中的 SwiftUI .matchedGeometryEffect 不起作用