flask、celery进行异步处理代码在window上运行开发

其中涉及的到的模块有flask、celery、redis;而需要的开发工具有Anaconda(创建虚拟环境)、git bash(用来切换虚拟服务)为celery运行提供环境。

1、celery进行异步服务启动:

其中celery是启动服务是依赖redis的,整个服务的启动顺序为:

  • 先启动redis服务
    在Windows启动redis服务的方法可以直接下载二进制文件,启动即可,其下载地址为:Windows 下的 Redis 的启动
    在linux下的就不介绍了。
  • 启动celery服务,这个时候需要用到的工具是git bash

1、其切换到对应虚拟环境的指令为:

source activate  
conda activate fod_rec

其中第一条指令一定要的,其是激活基础环境,然后再可以通过conda actviate切换到安装的虚拟环境里。

2、然后通过指令启动celery多进程:

celery -A main:celery_app worker --pool=solo -l info

这里的celery_app是在子包里定义的,而flask是在main里启动的,而main有import celery模块的,其中main的部分代码如下:

from apps import create_app
from apps import celery_app

app = create_app(celery_app)

其中-l info是指输出运行的具体信息,其中celery.task函数里的print等操作都是直接输出到启动celery的控制台上的,例如如下celery调用的一个函数代码为:

import time

def LoadAndExtractInfo(data):
    time.sleep(10)
    print("celery success!"

对应的celery控制台输出为:
flask、celery进行异步处理代码在window上运行开发_第1张图片
注意点: 其中启动celery的时候一般也要在主入口启动,如果跑到子模块里启动的话,会导致出现包引用的错误,如ImportError: attempted relative import with no known parent package
3、启动flask服务:
在启动完celery服务后,就可以启动整个处理的web服务了。启动flask服务有多种方法,可以自行百度。

2、celery使用orm数据库的方法

其中很多时候我们涉及到数据库存储,其中celery异步函数使用数据库的方式两种(自己已知的):

  • 第一种:
    直接再celery任务函数里定义orm数据库对象,(不太好) 例如:
@app.task
def celery_task():
    session = DB_Session()
    try:
        foo
    except:
        bar
    finally:
        session.close()
  • 第二种:
    定义orm数据库全局对象,然后在celery函数里进行操作数据库。这种方式好点,其中celery传递的args必须是要能被json格式化的参数,而SESSION_SQL是不能被json格式化的对象。因为json支持的变量只有:json只有null、布尔、数字、字符串、数组和对象这几种数据类型,JSON没有日期类型
SESSION_SQL = create_sql()
@celery_app.task
def CeleryLoadAndExtractInfo(data):
    session_sql = SESSION_SQL
    LoadAndExtractInfo(data, session_sql)

3.flask服务根据url获取对应的访问内容

这里是以获取celery异步服务的方法介绍,其中的获取异步处理结果的方法为:

class RecognizeResult(Resource):
    def get(self, taskid):
        task = CeleryLoadAndExtractInfo.AsyncResult(taskid)
        print(task.state)
        return response(0,data={'state':task.state,'result':task.result})

这里的方get方法的taskid是访问的url里的一个地址值,这个在flask-restful上的配置为:

from flask_restful import Api
def RegisterBluePrintApiV1(app):
    api = Api(app)
    api.add_resource(RecognizeResult,'/demo/recognize_result/',endpoint='taskid')
    api.add_resource(HealthCheck, '/', '/health')

注意这里的可以在里面添加数据类型,例如str、int。不知道是为啥,自己改为str:taskid的时候老是报错str。而改为int:taskid的时候如果不是int型的值则客户端接受到的是404. 没指定则两个格式的数据都可以获取

这里的访问地址为:

http://localhost:5000/api/v1/demo/recognize_result/2c3001
f9-9db6-457b-adcb-dfacf8b483c1

你可能感兴趣的:(web,python)