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后台执行任务的更多相关文章

  1. celery定时执行任务 的使用

    1 参照博客 https://www.cnblogs.com/xiaonq/p/9303941.html#i1 1 创建celery_pro包   # 可在任意文件下 2 在 celery_pro 下 ...

  2. supervisor 使 celery后台运行

    1.安装 supervisor pip install supervisor  2.创建supervisor配置文件,命令如下: 进入项目文件 echo_supervisord_conf > s ...

  3. forever让nodejs应用后台执行

    nodejs一般是当成一条用户命令执行的,当用户断开客户连接,运用也就停了,很烦人.如何让nodejs应用当成服务,在后台执行呢? 最简单的办法: $ nohup node app.js & ...

  4. Linux后台执行脚本文件,nohup

    看运维人员执行nohup命令后,把程序放在后台执行,很高大上,就研究了一下,这个命令. nohup命令及其输出文件 nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么 ...

  5. ASP.net绑定文本框Enter事件到按钮 ASP.NET执行后台执行JS方法

    txtAccountBarcode.Attributes.Add("onkeydown", "if(event.which || event.keyCode){if (( ...

  6. android: 后台执行的定时任务

    Android 中的定时任务一般有两种实现方式,一种是使用 Java API 里提供的 Timer 类, 一种是使用 Android 的 Alarm 机制.这两种方式在多数情况下都能实现类似的效果,但 ...

  7. linux 如何让程序后台执行

    $ (./test.sh &)   $ setsid ./test.sh &   $ nohup ./test.sh &   具体的转自:http://digdeeply.or ...

  8. PHP后台执行

    php中实现后台执行的方法: ignore_user_abort(true); // 后台运行set_time_limit(0); // 取消脚本运行时间的超时上限后台运行的后面还要,set_time ...

  9. IOS 后台执行

    在IOS后台执行是本文要介绍的内容,大多数应用程序进入后台状态不久后转入暂停状态.在这种状态下,应用程序不执行任何代码,并有可能在任意时候从内存中删除.应用程序提供特定的服务,用户可以请求后台执行时间 ...

随机推荐

  1. MySQL | 查看log日志

    1. 进入mysql mysql -u用户名 -p密码 2. 开启日志 et global general_log=on: 3. 查看mysql日志文件的路径 show variables like ...

  2. CrystalDecisions.Windows.Forms文件

    1.CrystalDecisions.Windows.Forms 相关dll文件 CrystalDecisions.Crystalreports.Engine.dllCrystalDecisions. ...

  3. normalization, standardization and regularization

    Normalization Normalization refers to rescaling real valued numeric attributes into the range 0 and ...

  4. 1、spring与springmvc父子容器

    转载于http://www.tianshouzhi.com/api/tutorials/spring 1.0 spring与springmvc父子容器 1.spring和springmvc父子容器概念 ...

  5. Linux - 文件时间戳

    概述 简介 linux 文件时间戳 背景 最近感觉很消极的样子 心情不好加不知道写啥 随便水一水 能水的就那么多, 水一次, 少一次 环境 os centos7 1. 时间戳 概述 简述 时间戳 li ...

  6. Redis非关系型缓存数据库集群部署、参数、命令工具

    <关系型数据库与非关系型数据库> 关系数据库:mysql.oracle.DB2.SQL Server非关系数据库:Redis(缓存数据库).MongodDB(处理海量数据).Memcach ...

  7. 微信小程序 购物车流程

    购物车流程 一.需求分析 a:全选,单选,根据选中的计算数目和总价 b:单个商品加减 c:删除一个商品 wxml 布局 <view> <view v-if="flag&qu ...

  8. execute command denied to user 'maintain'@'%' for routine

    GRANT ALL PRIVILEGES ON *.* TO 'maintain'@'%' ; FLUSH PRIVILEGES;

  9. AVR单片机教程——DAC

    本文隶属于AVR单片机教程系列.   单片机的应用场景时常涉及到模拟信号.我们已经会使用ADC把模拟信号转换成数字信号,本讲中我们要学习使用DAC把数字信号转换成模拟信号.我们还将搭建一个简单的功率放 ...

  10. 使用SqlDataReader的查询操作

    原创weixin_42430576 发布于2019-01-31 18:49:41 阅读数 762  收藏 展开 using System; using System.Collections.Gener ...