celery异步任务
这里是celery实现异步的方法
task.py 你可以叫任何名字,但是celery命令的时候要同时改
celery -A package_dir.your_task_filename.your_celery_app_name worker -l info
# coding=utf-8
import connexion
import copy
import requests
import json
import time
import uuid
from celery import Celery
from flask import jsonify
from bson.objectid import ObjectId
from .api.endpoints.config import CELERY_BROKER_URL_TASK, CELERY_RESULT_BACKEND_TASK
app = connexion.FlaskApp(__name__, specification_dir='.')
application = app.app
# Celery configuration db 9
application.config['CELERY_BROKER_URL'] = CELERY_BROKER_URL_TASK
application.config['CELERY_RESULT_BACKEND'] = CELERY_RESULT_BACKEND_TASK
def make_celery(app):
celery = Celery(app.name, backend=app.config['CELERY_RESULT_BACKEND'],
broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
TaskBase = celery.Task
class ContextTask(TaskBase):
abstract = True
def __call__(self, *args, **kwargs):
with app.app_context():
return TaskBase.__call__(self, *args, **kwargs)
celery.Task = ContextTask
return celery
celery = make_celery(app.app)
@celery.task(bind=True)
def calling_api(self, url):
return url
#
# 服务器使用一个
# screen -S celery_service
# cd app, app和flask的main.py同一目录,都位于文件夹app下,我的celery叫做celery,不叫app;
# celery -A app.task.celery worker -l info
在别的地方使用的时候, 如果不需要返回结果:
from ...task import calling_api async_outcome = calling_api.apply_async(args=[url])或者 async_outcome = calling_api.delay(args=[url])
在别的地方使用的时候, 如果需要返回结果:
async_outcome = calling_api.apply_async(args=[url])
task_id = str(async_outcome)
task = calling_api.AsyncResult(task_id)
start = time.time()
while True:
if time.time() - start > 10:
result['code'] = 1
result['message'] = "failed, time out!"
break
elif task.status == 'SUCCESS':
print("ASYNC task_id:", task.id)
print("ASYNC task:", task.result)
result['data']['image'] = task.result.get("data").get("image")
break

浙公网安备 33010602011771号