美文网首页
【Flask】简单的后台异步队列

【Flask】简单的后台异步队列

作者: 小熊猫笔记 | 来源:发表于2019-06-24 15:18 被阅读0次

异步任务队列

_task_queue = Queue.Queue()

异步队列输入

def async_call(function, callback, task_id, task_name, *args, **kwargs):
    _task_queue.put({
        'function': function,
        'callback': callback,
        'task_id': task_id,
        'task_name': task_name,
        'args': args,
        'kwargs': kwargs
    })

异步队列获取并执行

def _task_queue_consumer(**kwargs):
    """
    异步任务队列消费者
    """
    db = kwargs.get("db_queue")
    while True:
        try:
            #循环间隔获取,避免no-block或者一直获取无法停止
            task = _task_queue.get(timeout=10)
            func = task.get('function')

            task_id = task.get('task_id')
            task_name = task.get('task_name')

            task_args = task.get('args')
            task_kwargs = task.get('kwargs')
            try:
                result_code, result_value = func(*task_args, **task_kwargs)
            except Exception as ex:
                #数据库记录任务
                record_task(db, task_name, task_id, result=ex, state=3)
            else:
                if result_code == 200:
                    record_task(db, task_name, task_id, result=result_value, state=1)
                else:
                    record_task(db, task_name, task_id, result=result_value, state=2)
            finally:
                _task_queue.task_done()
        except Queue.Empty:
            #状态位,通过视图函数实现线程间通信,关闭时置位
            if not work_state.running_state():
                break
        except Exception:
            log.error("Queue Error!", exc_info=True)

创建线程开始执行方法并返回进程号

def work_queue(*args, **kwargs):
    t = threading.Thread(target=_task_queue_consumer, args=args, kwargs=kwargs)
    t.start()
    _task_queue.join()
    return t

主函数与flask main一起执行

if __name__ == '__main__':
    work_queue(db_queue=db_queue)
    app.run(host="0.0.0.0", port=8989, debug=True, threaded=True)

优势:

1.单任务后台执行,完全不阻塞前台运行
2.任务获取可以伴随自定义的回调函数操作(上面的是数据库操作)

缺点:

1.单线程局限性,没有多并发功能

相关文章

  • 【Flask】简单的后台异步队列

    异步任务队列 异步队列输入 异步队列获取并执行 创建线程开始执行方法并返回进程号 主函数与flask main一起...

  • 实现简单的python3+flask+celery+redis框

    详解python3+flask+celery+redis Celery是什么? Celery是个异步分布式任务队列...

  • AskMe项目 异步队列

    异步队列简单介绍 队列实现异步可以用单向队列,任务放到队列中,先进先出,或者使用优先队列,按照优先级来选择谁先执行...

  • GCD基础总结一

    上代码~ 同步串行队列 同步并行队列 异步串行队列 异步并行队列 主队列同步 会卡住 主队列异步

  • 3.3.3 队列式异步请求

    URL 加载系统执行的队列式异步请求位于队列中, 可能位于后台线程上. 在 iOS 5.0 中增加 只有在知道返回...

  • GCD的几种创建方式及基本使用

    同步函数 同步函数+主队列 同步函数+串行队列 同步函数+并发队列 异步函数 异步函数+主队列 异步函数+串行队列...

  • Flask-Admin 后台管理介绍

    Flask-Admin 后台管理 Flask-Admin是一个简单易用的Flask扩展,让你可以很方便并快速地为F...

  • GCD队列、同步异步

    GCD队列、同步异步 GCD队列、同步异步

  • 多线程GCD笔记

    同步函数 + 主队列 异步函数 + 主队列 同步函数 + 串行队列 异步函数 + 串行队列 同步函数 + 并发队列...

  • 消息队列及整合rabbitmq

    1. 消息队列 简单理解就是存放消息的队列 优点 异步比如:利用消息队列,可以将请求存入队列即响应给用户,不用等到...

网友评论

      本文标题:【Flask】简单的后台异步队列

      本文链接:https://www.haomeiwen.com/subject/ukhoqctx.html