python apscheduler、任务可以是死循环吗_flask_apscheduler 定时任务踩坑记录

背景

由于需要再flask做一个定时任务,然后发现了这个库flask_apscheduler.使用很简单,就是可能由于某种情况,会有一些意外,下面是我的使用记录。

首先按照官方文档跑一个示例

from flask import Flask

from flask_apscheduler import APScheduler

class Config(object):

JOBS = [

{

'id': 'job1',

'func': 'jobs:job1',

'args': (1, 2),

'trigger': 'interval',

'seconds': 10

}

]

SCHEDULER_API_ENABLED = True

def job1(a, b):

print(str(a) + ' ' + str(b))

if __name__ == '__main__':

app = Flask(__name__)

app.config.from_object(Config())

scheduler = APScheduler()

# it is also possible to enable the API directly

# scheduler.api_enabled = True

scheduler.init_app(app)

scheduler.start()

app.run()

'func': 'jobs:job1', 配置文件中这一行,代表任务。jobs代表这个文件名。job1是自己创建的任务函数。

ok,这里没有任何问题

问题1:在实际项目中,不可能都放在同一个文件下,创建一个任务时,找不到这个任务

如,我定义一个start函数,用于执行定时任务,这个start在app.models.ali路径下。问题原因是:'func': 'app:start'配置格式等有误,正确应该按照自己任务文件的实际路径,格式为:'func': 'app:models.ali.start',如下:

class Config:

JOBS = [

{

'id': 'job1',

'func': 'app:models.ali.start',

'trigger': 'cron',

'day_of_week': 'mon-fri',

'second': 1,

'hour': 9,

'minute': 30

}

]

SCHEDULER_API_ENABLED = True

问题2:在model文件里使用SQLAlchemy时,报错类似:No application found.flask-apsched Either work inside a view function or pus,也就是无法在任务函数中使用SQLAlchemy。解决办法:

app的__init__.py关键代码:

from flask_apscheduler import APScheduler

scheduler = APScheduler()

def create_app(config_name):

app = Flask(__name__, template_folder='templates')

app.config.from_object(config.get(config_name) or config['default'])

...

scheduler.init_app(app)

scheduler.start()

return app

然后我的任务start在app.models.ali路径下,需要在ali.py下:

from app import scheduler

def start():

with scheduler.app.app_context():

results = AliServers.query.all()

···

添加上下文后,就可以使用AliServers.query.all()这种操作了。

问题3:

本机开发环境下,一切正常,然后部署到服务器上,出错:

Traceback (most recent call last):

File "test.py", line 29, in

scheduler = APScheduler()

File "/root/.local/share/virtualenvs/flask-fUo2koNK/lib/python3.6/site-packages/flask_apscheduler/scheduler.py", line 36, in __init__

self._scheduler = scheduler or BackgroundScheduler()

File "/root/.local/share/virtualenvs/flask-fUo2koNK/lib/python3.6/site-packages/apscheduler/schedulers/base.py", line 87, in __init__

self.configure(gconfig, **options)

File "/root/.local/share/virtualenvs/flask-fUo2koNK/lib/python3.6/site-packages/apscheduler/schedulers/base.py", line 126, in configure

self._configure(config)

File "/root/.local/share/virtualenvs/flask-fUo2koNK/lib/python3.6/site-packages/apscheduler/schedulers/background.py", line 29, in _configure

super(BackgroundScheduler, self)._configure(config)

File "/root/.local/share/virtualenvs/flask-fUo2koNK/lib/python3.6/site-packages/apscheduler/schedulers/base.py", line 697, in _configure

self.timezone = astimezone(config.pop('timezone', None)) or get_localzone()

File "/root/.local/share/virtualenvs/flask-fUo2koNK/lib/python3.6/site-packages/tzlocal/unix.py", line 165, in get_localzone

_cache_tz = _get_localzone()

File "/root/.local/share/virtualenvs/flask-fUo2koNK/lib/python3.6/site-packages/tzlocal/unix.py", line 90, in _get_localzone

utils.assert_tz_offset(tz)

File "/root/.local/share/virtualenvs/flask-fUo2koNK/lib/python3.6/site-packages/tzlocal/utils.py", line 38, in assert_tz_offset

raise ValueError(msg)

ValueError: Timezone offset does not match system offset: 28800 != -14400. Please, check your config files.

根据错误信息查看源码,解决办法:

主要是两个地方:

首先查看服务器时区是上海,然后需要修改两个地方:

在配置文件中添加SCHEDULER_TIMEZONE = 'Asia/Shanghai',即:

class Config:

JOBS = [

{

'id': 'job1',

'func': 'app:models.ali.start',

'trigger': 'cron',

'day_of_week': 'mon-fri',

'second': 1,

'hour': 9,

'minute': 30

}

]

SCHEDULER_TIMEZONE = 'Asia/Shanghai'

SCHEDULER_API_ENABLED = True

然后在app的__init__.py下,添加BackgroundScheduler(timezone="Asia/Shanghai"):

from flask_apscheduler import APScheduler

from apscheduler.schedulers.background import BackgroundScheduler

scheduler = APScheduler(BackgroundScheduler(timezone="Asia/Shanghai"))

def create_app(config_name):

app = Flask(__name__, template_folder='templates')

app.config.from_object(config.get(config_name) or config['default'])

...

scheduler.init_app(app)

scheduler.start()

return app

原因是:时区会被解析两次,如果没有加时区,就会调用默认的self.timezone = astimezone(config.pop('timezone', None)) or get_localzone(),由于时区与系统不匹配,会报错。当然这个错误并不是每个机器都有,正巧,这台服务器的时区与系统偏移不一致,导致出现这个错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Flask-APScheduler在MongoDB中实现定时任务,只需要在Flask应用中定义一个定时任务,并将其配置为在MongoDB中运行。具体代码如下:from flask_apscheduler import APSchedulerscheduler = APScheduler()# Configure the scheduler to use MongoDB as its job store scheduler.add_jobstore('mongodb', host='localhost', database='your_database_name')@scheduler.task('interval', id='do_job_1', seconds=30) def job_1(): print("Job 1 executed")@scheduler.task('cron', id='do_job_2', day_of_week='mon-sun', hour='12', minute='30') def job_2(): print("Job 2 executed")# Start the scheduler scheduler.start() ### 回答2: 要使用Flask-APScheduler实现数据库MongoDB定时任务,首先需要安装Flask-APScheduler和pymongo库。在Flask应用程序中,可以使用以下代码实现: 1. 首先,在app.py文件中导入所需的模块和库: ```python from flask import Flask from flask_apscheduler import APScheduler from pymongo import MongoClient ``` 2. 创建Flask应用程序实例: ```python app = Flask(__name__) ``` 3. 配置MongoDB连接并创建MongoDB客户端: ```python app.config['MONGO_URI'] = 'mongodb://localhost:27017/db_name' mongo_client = MongoClient(app.config['MONGO_URI']) ``` 请注意,`db_name`应替换为你的实际数据库名称,`localhost:27017`应替换为你的MongoDB服务器地址和端口。 4. 初始化APScheduler实例并配置任务存储: ```python scheduler = APScheduler() scheduler.init_app(app) scheduler.start() ``` 5. 创建一个定时任务函数,该函数将执行需要定时执行的操作。这里以向MongoDB数据库中插入一条记录为例: ```python def insert_data(): db = mongo_client.db_name collection = db.collection_name data = {'name': 'John', 'age': 30} collection.insert_one(data) ``` 请注意,`db_name`和`collection_name`应替换为你的实际数据库和集合名称。 6. 创建一个定时任务,并将其添加到APScheduler中: ```python scheduler.add_job(func=insert_data, trigger='interval', seconds=60) ``` 这将每隔60秒执行一次`insert_data`函数。 7. 最后,在Flask应用程序的入口处,启动Flask应用程序: ```python if __name__ == '__main__': app.run() ``` 以上代码片段演示了如何使用Flask-APScheduler和pymongo库实现数据库MongoDB定时任务的基本步骤。根据实际需求,你可以根据需要调整设置和任务函数。 ### 回答3: 要使用Flask-APScheduler实现MongoDB数据库的定时任务,需要先安装Flask和Flask-APScheduler库,并且确保MongoDB数据库已经正确安装和配置。 首先,在Flask应用中导入所需要的库和模块: ```python from flask import Flask from flask_apscheduler import APScheduler from pymongo import MongoClient ``` 然后,创建Flask应用和APScheduler实例并配置MongoDB数据库的连接: ```python app = Flask(__name__) scheduler = APScheduler() scheduler.init_app(app) # 配置MongoDB数据库连接 client = MongoClient('mongodb://localhost:27017/') # 替换为实际的MongoDB连接地址 db = client['mydatabase'] # 替换为实际的数据库名称 ``` 接下来,创建一个定时任务函数,该函数在特定时间间隔内会被调度执行,并且可以在函数中访问MongoDB数据库: ```python @scheduler.task('interval', id='my_job', minutes=30) def my_task(): collection = db['mycollection'] # 替换为实际的集合名称 # 在此处添加需要执行的MongoDB操作,例如插入、更新、删除等 # 例如:collection.insert_one({"name": "example"}) ``` 最后,启动定时任务调度器和Flask应用: ```python @app.route('/') def index(): return 'Flask-APScheduler MongoDB Demo' if __name__ == '__main__': scheduler.start() app.run() ``` 启动应用后,定时任务会按照预定的时间间隔执行,并且可以在`my_task()`函数中进行MongoDB的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值