标签:dir bit 环境搭建 mat 访问 async 使用 cos rgs
doc:https://flask.palletsprojects.com/en/1.0.x/patterns/celery/
mkdir celery_tasks
from celery import Celery # celery my_celery = Celery(‘my_celery‘)
from celery_tasks import my_celery
@my_celery.task
def add_together(a, b):
#print(‘add_together执行中。。。‘)
return a + b
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)
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
@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() < 0.25:
message = ‘{0} {1} {2}...‘.format(random.choice(verb),
random.choice(adjective),
random.choice(noun))
self.update_state(state=‘PROGRESS‘,
meta={‘current‘: i, ‘total‘: total,
‘status‘: message})
time.sleep(1)
return {‘current‘: 100, ‘total‘: 100, ‘status‘: ‘Task completed!‘,
‘result‘: 42}
@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)
代码段太长,也不是本文重点,链接地址:
https://github.com/miguelgrinberg/flask-celery-example
简单来说就是通过ajax不停访问/status/
(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,访问相应地址就可以验证效果了。
标签:dir bit 环境搭建 mat 访问 async 使用 cos rgs
原文地址:https://www.cnblogs.com/wodeboke-y/p/11600946.html