falsk 使用celery后台执行任务
falsk 使用celery后台执行任务
1.基础环境搭建
doc:https://flask.palletsprojects.com/en/1.0.x/patterns/celery/
mkdir celery_tasks
init.py # 实例化celery
from celery import Celery # celery
my_celery = Celery('my_celery')
task_1.py # celery任务
from celery_tasks import my_celery @my_celery.task
def add_together(a, b):
#print('add_together执行中。。。')
return a + b
app.init # celery实例配置
from .app import create_app, db flask_app = create_app() from celery_tasks import my_celery
from .app import _handle_celery_task
_handle_celery_task(flask_app, my_celery)
配置方法位于app.app.py
def _handle_celery_task(app, my_celery):
# celery
my_celery.conf['broker_url'] = 'redis://:123@192.168.199.113:6379/0'
my_celery.conf['result_backend'] = 'redis://:123@192.168.199.113:6379/0'
my_celery.conf['imports'] = ['celery_tasks.tasks_1'] from celery.task import Task class ContextTask(Task):
def on_success(self, retval, task_id, args, kwargs):
print('task done: {0}'.format(retval))
return super(ContextTask, self).on_success(retval, task_id, args, kwargs) def on_failure(self, exc, task_id, args, kwargs, einfo):
print('task fail, reason: {0}'.format(exc))
return super(ContextTask, self).on_failure(exc, task_id, args, kwargs, einfo) def __call__(self, *args, **kwargs):
print('应用名:', app.name)
with app.app_context():
print(app.route)
return self.run(*args, **kwargs) my_celery.Task = ContextTask
2.带状态更新的后台任务
task
@celery.task(bind=True)
def long_task(self):
"""Background task that runs a long function with progress reports."""
verb = ['Starting up', 'Booting', 'Repairing', 'Loading', 'Checking']
adjective = ['master', 'radiant', 'silent', 'harmonic', 'fast']
noun = ['solar array', 'particle reshaper', 'cosmic ray', 'orbiter', 'bit']
message = ''
total = random.randint(10, 50)
for i in range(total):
if not message or random.random()route
@app.route('/celery_1', methods=['GET', 'POST'])
def celery_1():
if request.method == 'GET':
return render_template('celery_t.html') @app.route('/longtask', methods=['POST'])
def longtask():
task = long_task.apply_async()
return jsonify({}), 202, {'Location': url_for('taskstatus',
task_id=task.id)} @app.route('/status/')
def taskstatus(task_id):
task = long_task.AsyncResult(task_id)
if task.state == 'PENDING':
# job did not start yet
response = {
'state': task.state,
'current': 0,
'total': 1,
'status': 'Pending...'
}
elif task.state != 'FAILURE':
response = {
'state': task.state,
'current': task.info.get('current', 0),
'total': task.info.get('total', 1),
'status': task.info.get('status', '')
}
if 'result' in task.info:
response['result'] = task.info['result']
else:
# something went wrong in the background job
response = {
'state': task.state,
'current': 1,
'total': 1,
'status': str(task.info), # this is the exception raised
}
return jsonify(response)celery_1.html
代码段太长,也不是本文重点,链接地址:
https://github.com/miguelgrinberg/flask-celery-example
简单来说就是通过ajax不停访问/status/<task_id>,根据返回的数据更新网页。3.运行
(venv) >celery -A app worker -l info -P eventlet
--logfile=c.log
需要注意的是命令中所指向的模块一定要是配置后的Celery实例所在,否则会得到一个空注册任务的celery。可以看到tasks列表
[tasks]
. app.app.ContextTask
. celery_tasks.tasks_1.add_togethe
. celery_tasks.tasks_1.long_task然后运行flask,访问相应地址就可以验证效果了。
falsk 使用celery后台执行任务的更多相关文章
- celery定时执行任务 的使用
1 参照博客 https://www.cnblogs.com/xiaonq/p/9303941.html#i1 1 创建celery_pro包 # 可在任意文件下 2 在 celery_pro 下 ...
- supervisor 使 celery后台运行
1.安装 supervisor pip install supervisor 2.创建supervisor配置文件,命令如下: 进入项目文件 echo_supervisord_conf > s ...
- forever让nodejs应用后台执行
nodejs一般是当成一条用户命令执行的,当用户断开客户连接,运用也就停了,很烦人.如何让nodejs应用当成服务,在后台执行呢? 最简单的办法: $ nohup node app.js & ...
- Linux后台执行脚本文件,nohup
看运维人员执行nohup命令后,把程序放在后台执行,很高大上,就研究了一下,这个命令. nohup命令及其输出文件 nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么 ...
- ASP.net绑定文本框Enter事件到按钮 ASP.NET执行后台执行JS方法
txtAccountBarcode.Attributes.Add("onkeydown", "if(event.which || event.keyCode){if (( ...
- android: 后台执行的定时任务
Android 中的定时任务一般有两种实现方式,一种是使用 Java API 里提供的 Timer 类, 一种是使用 Android 的 Alarm 机制.这两种方式在多数情况下都能实现类似的效果,但 ...
- linux 如何让程序后台执行
$ (./test.sh &) $ setsid ./test.sh & $ nohup ./test.sh & 具体的转自:http://digdeeply.or ...
- PHP后台执行
php中实现后台执行的方法: ignore_user_abort(true); // 后台运行set_time_limit(0); // 取消脚本运行时间的超时上限后台运行的后面还要,set_time ...
- IOS 后台执行
在IOS后台执行是本文要介绍的内容,大多数应用程序进入后台状态不久后转入暂停状态.在这种状态下,应用程序不执行任何代码,并有可能在任意时候从内存中删除.应用程序提供特定的服务,用户可以请求后台执行时间 ...
随机推荐
- 如何在Word中排出漂亮的代码,去除回车符,去除拼写检查
这位博主写到很到位,这里补充一下在VBA里用模块的部分. https://blog.csdn.net/code4101/article/details/41802715 1.放代码的方式是贴纯文本. ...
- 【转】常见的hash算法及其原理
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是 ...
- TP5和TP3.2的使用区别
模板标签不一样: TP5 可在配置文件中自行定义自己喜欢的标签 TP5 使用双标签 如:{foreach} {/foreach} TP3 : <> TP5 :{} 调用数据表方式: M( ...
- util之Set
1.定义: Set<Integer>set = new TreeSet<Integer>(); 注意: TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不 ...
- LOJ138 类欧几里得算法
类欧几里得算法 给出 \(T\) 组询问,每组用 \(n, a, b, c, k_1, k_2\) 来描述.对于每组询问,请你求出 \[ \sum_{x = 0} ^ {n} x ^ {k_1} {\ ...
- emoji大全_如何明智地使用emoji: 😄
官网 https://www.webfx.com/tools/emoji-cheat-sheet/ emoji那么多,如何准确地使用到自己想要到呢?
- linux下grep分析apache日志的命令集合
https://my.oschina.net/hmc0316/blog/112004 实例:月份英文简写英文全称一月Jan.January二月Feb.February三月Mar.March四月Apr. ...
- Linux上查看当前系统各内存分区信息
命令 ulimit -a -a 查看所有信息,同理,也可以例如 ulimit -s 只查看栈占内存信息
- Java实现Word/Pdf/TXT转html
引言: 最近公司在做一个教育培训学习及在线考试的项目,本人主要从事网络课程模块,主要做课程分类,课程,课件的创建及在线学习和统计的功能,因为课件涉及到多种类型,像视频,音频,图文,外部链接及文档类型. ...
- Bugku-CTF分析篇-抓到一只苍蝇(在哪?here!卧槽?!好大一坨苍蝇。)
抓到一只苍蝇 抓到一只苍蝇 本题要点:pcapng包导出文件.合并连续的pcapng包.rar文件头.binwalk基本使用.foremost安装及使用 下载完成后,发现有这样 ...