精华内容
下载资源
问答
  • web网站包含前端和后端, 异步处理可以用在前端, 也可以用在后端. 前端 jquery 进行 ajax 请求时, 可设置 async 属性为 true, 并为 success 设置一个 callback 函数, 在服务端返回之前, 浏览器可以执行 ajax 之后的...

    web网站包含前端和后端, 异步处理可以用在前端, 也可以用在后端.  前端 jquery 进行 ajax 请求时, 可设置 async 属性为 true, 并为 success 设置一个 callback 函数, 在服务端返回之前, 浏览器可以执行 ajax 之后的代码, 当服务器端返回后, jquery会执行 success 回调.

    后端的视图函数也可以引入这种异步处理机制,  发扬广大的是nodejs了, nodejs web服务单线程异步处理方式, 一般来讲, nodejs 框架的并发性要比Django/Flask 要好, 主要原因是 Django/Flask 都是基于 WSGI 同步处理模式的, WSGI 采用多线程方式来支持并发, 和协程相比, 多线程资源消耗要大的多,  所以并发性要差一些.  当然如果我们的 Django/Flask web应用配合 Gunicorn(高性能的WSGI服务器) 和 nginx(高性能Web服务器) 部署, 并发也会有一定的改善.

    为了改善 flask 的并发, flask 社区主要尝试了两个方向:

    1. 尝试在 flask 中引入 async 机制,  比如 flask_aiohttp 项目,   在python 中 async 和 sync 编程分别属于两个世界, 所以整合起来难度和稳定性都成问题, 目前该方向已经被放弃.

    2. 将耗时的视图交由 celery 作异步处理, 其他视图仍采用同步方式. celery 可以采用 redis 做 back end. 这个机制优缺点都很明显, 优点是, 在没有增加编码复杂度的情形下, 可以明显改善并发处理能力,  缺点是, 引入了两个 celery 和 redis 两个集群, 增加了部署和运维复杂度.

    目前方向2应该是正解,  交由celery的异步视图函数, 和使用 async-await 的异步还有有一些差异的, 最主要的是使用异步 celery task的视图函数, 在触发task后返回到视图函数, 而调用async任务后, 视图函数并不会马上得到代码执行权, 直到async任务完成后, 才能得到代码执行权.

    所以, 使用 celery 的异步api, 通常仅仅是触发后台任务, 通常还有一个配套的api, 用来查询后台任务的status.

    详见:

    https://blog.miguelgrinberg.com/post/using-celery-with-flask

    http://allynh.com/blog/flask-asynchronous-background-tasks-with-celery-and-redis/

    windows 下的开发:

    celery 采用 3.1.25 版本, 之后的 celery 不支持 window平台.

    Redis-x64-3.0.504.msi 下载地址 https://github.com/MicrosoftArchive/redis/releases

    展开全文
  • 最近在开发同步mysql数据到redis的接口,因为数据同步涉及各种增删查改,如果用同步实现,可能回造成连接超时、堵塞,所以,使用python实现异步任务。代码实现from flask import Flaskimport timefrom concurrent....

    最近在开发同步mysql数据到redis的接口,因为数据同步涉及各种增删查改,如果用同步实现,可能回造成连接超时、堵塞,所以,使用python实现异步任务。

    代码实现

    from flask import Flask

    import time

    from concurrent.futures import ThreadPoolExecutor

    executor = ThreadPoolExecutor(1)

    app = Flask(__name__)

    @app.route('/synchronize')

    def update_redis():

    executor.submit(do_update)

    return 'ok'

    def do_update():

    time.sleep(3)

    print('start update')

    if __name__ == '__main__':

    app.run()

    这样便能快速告诉接口调用者你已经知道需要同步数据,同时在后台进行所需要的操作,不至于因为等待而造成的无谓的阻塞以及超时

    展开全文
  • 前言最近做物联网项目的时候需要搭建一个异步非阻塞的HTTP服务器,经过查找资料,发现...# coding=utf-8# Python Version: 3.5.1# Flaskfrom flask import Flask, request, g# geventfrom gevent import monkeyfrom ...

    前言

    最近做物联网项目的时候需要搭建一个异步非阻塞的HTTP服务器,经过查找资料,发现可以使用gevent包。

    代码清单

    下面放上代码清单,以后需要用到的时候直接移植即可。

    # coding=utf-8

    # Python Version: 3.5.1

    # Flask

    from flask import Flask, request, g

    # gevent

    from gevent import monkey

    from gevent.pywsgi import WSGIServer

    monkey.patch_all()

    # gevent end

    import time

    app = Flask(__name__)

    app.config.update(DEBUG=True)

    @app.route('/asyn/', methods=['GET'])

    def test_asyn_one():

    print("asyn has a request!")

    time.sleep(10)

    return 'hello asyn'

    @app.route('/test/', methods=['GET'])

    def test():

    return 'hello test'

    if __name__ == "__main__":

    # app.run()

    http_server = WSGIServer(('', 5000), app)

    http_server.serve_forever()

    测试

    打开浏览器,首先请求http://127.0.0.1:5000/asyn/,然后

    再请求http://127.0.0.1:5000/test/这个接口十次。如果是一般的Flask框架,后面的接口是没有响应的。

    打印内容如下:

    asyn has a request!

    127.0.0.1 - - [2016-10-24 20:45:10] “GET /test/ HTTP/1.1” 200 126 0.000000

    127.0.0.1 - - [2016-10-24 20:45:11] “GET /test/ HTTP/1.1” 200 126 0.000000

    127.0.0.1 - - [2016-10-24 20:45:11] “GET /test/ HTTP/1.1” 200 126 0.000000

    127.0.0.1 - - [2016-10-24 20:45:12] “GET /test/ HTTP/1.1” 200 126 0.000000

    127.0.0.1 - - [2016-10-24 20:45:12] “GET /test/ HTTP/1.1” 200 126 0.000998

    127.0.0.1 - - [2016-10-24 20:45:13] “GET /test/ HTTP/1.1” 200 126 0.001001

    127.0.0.1 - - [2016-10-24 20:45:14] “GET /test/ HTTP/1.1” 200 126 0.000000

    127.0.0.1 - - [2016-10-24 20:45:14] “GET /test/ HTTP/1.1” 200 126 0.001014

    127.0.0.1 - - [2016-10-24 20:45:15] “GET /test/ HTTP/1.1” 200 126 0.001000

    127.0.0.1 - - [2016-10-24 20:45:15] “GET /test/ HTTP/1.1” 200 126 0.000000

    127.0.0.1 - - [2016-10-24 20:45:18] “GET /asyn/ HTTP/1.1” 200 126 10.000392

    参考资料

    展开全文
  • 小编典典我将使用Celery为你处理异步任务。你需要安装代理以充当任务队列(建议使用RabbitMQ和Redis)。app.py:from flask import Flaskfrom celery import Celerybroker_url = 'amqp://guest@localhost' # Broker ...

    小编典典

    我将使用Celery为你处理异步任务。你需要安装代理以充当任务队列(建议使用RabbitMQ和Redis)。

    app.py:

    from flask import Flask

    from celery import Celery

    broker_url = 'amqp://guest@localhost' # Broker URL for RabbitMQ task queue

    app = Flask(__name__)

    celery = Celery(app.name, broker=broker_url)

    celery.config_from_object('celeryconfig') # Your celery configurations in a celeryconfig.py

    @celery.task(bind=True)

    def some_long_task(self, x, y):

    # Do some long task

    ...

    @app.route('/render/', methods=['POST'])

    def render_script(id=None):

    ...

    data = json.loads(request.data)

    text_list = data.get('text_list')

    final_file = audio_class.render_audio(data=text_list)

    some_long_task.delay(x, y) # Call your async task and pass whatever necessary variables

    return Response(

    mimetype='application/json',

    status=200

    )

    运行你的Flask应用,然后启动另一个过程来运行你的Celery工作者。

    $ celery worker -A app.celery --loglevel=debug

    2020-04-05

    展开全文
  • 本文研究的主要是Flask实现异步非阻塞请求功能,具体实现如下。最近做物联网项目的时候需要搭建一个异步非阻塞的HTTP服务器,经过查找资料,发现可以使用gevent包。关于geventGevent 是一个 Python 并发网络库,它...
  • Flask异步操作实例

    2020-08-28 09:47:18
    之前遇到过一个问题就是执行某个操作,也要对数据库进行读写,且数量较大,时间比较久,用户点击一个按钮,会卡很久才跳出完成或...后来上网查阅资料,发现可以自己在该异步函数中新建一个app,即可访问数据库,但好像
  • 运行后的部分截图为: 接着启动Flask服务,在任务控制台输入需要扫描的网址: 新建任务后查看Celery的日志信息,可以看到运行成功,同时与使用原生线程/进程一样,浏览器立即返回,异步处理成功。 后面的博客将学习...
  • 官方其实已经给出了方案,只不过藏的有点深,在加上网上有很多不太...解决方案: flask+gevent安装geventpip install gevent修改代码# 文件头部from gevent import monkeyfrom gevent.pywsgi import WSGIServer# 在...
  • 比如在接口中执行某些操作之后,执行异步通知的操作但不使用消息队列或redis,可以通过信号的方式来做。from flask.signals import Namespace_signal = Namespace()apply_task_signal = _signal.signal(name='some',...
  • 异步任务队列_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...
  • 说在前头用Python搞后台...安装使用pip来安装,环境python3+Flask-Celery-Helper==1.1.0celery==4.1.0redis==3.0.1准备工作目录结构app|-__init__.py|-tasks.pyconfig.pycelery_runner.pycelery_runner.pytasks.pyde...
  • 对于 Web 应用程序,往往需要有很多讯息及时的通知到...而在 Flask 应用当中,我们可以选择 flask-mail 插件来把邮件功能很好的集成到我们的应用当中,安装和初始化都是我们熟悉命令和配置安装:pip install flask-m...
  • 迁移 Flask 服务器以获得更好的性能和可维护性。 本文最初发布于 BetterProgramming,经原作者授权由 InfoQ 中文站翻译并分享。本文将介绍 FastAPI 背后的基本概念,以及将 Flask 服务器过渡到 FastAPI 服务器所...
  • 在本文中,会详细解释异步是什么以及它与普通 Python 代码有什么不同。你是否听人们说过,异步 Python 代码比“普通(或同步)Python 代码更快?果真是那样吗?1“同步”和“异步”是什么意思?Web 应用程序通常要...
  • 前言Flask 是 Python 开发的轻量 Web 框架,有多轻量呢?10 行以内就可以开发一个 Web 服务,不过这只能用来做演示,今天我就用 1 个小时来开发一个用于生产环境的短信微服务。以下是生产环境直接可用的服务代码,...
  • 如果Flask代码没有被修改为异步运行,那么每次每个进程只能运行一个请求。当您从本地开发扩展到每秒数百个或数千个请求(rps)的生产负载时,这可能会变成一个问题。将Flask应用产品化的第一步是将其置于WSGI后端,...
  • celery是什么,有什么用?对于celery,各种文档解释一堆,...首先理解一个概念:阻塞理解阻塞,先从耗时操作讲起,常见的场景比如用户输入、等待(sleep)这些都属于,具体到实际项目中比如说发邮件、发短信、机器/深...
  • # 使用create_app创建app对象 from flask import Flask from flask_sqlalchemy import SQLAlchemy ...在需要操作数据库的模块中进行如下操作: from yourapp import create_app from time imp..
  • flask 异步发送邮件 --

    2019-04-22 22:30:00
    异步发送邮件 ...因为这时候程序正在发送电子邮件,发信的操作阻断了请求--响应循环,直到发信的send_...这几秒的延迟带了不好的用户体验,为了避免这个延迟,我们可以将发信函数放入后台线程异步执行,以Flask-Mail...
  • 这种操作对于新手来讲特别常见,良许之前也是这样。在本文,老司机将带你来进行更高效的操作,只需一步即可达到你想要的效果。 而且,不仅仅是实现快速进入到 Linux 服务器特定的目录,还可以实现在连接上服务器的...
  • flask开启异步任务

    千次阅读 2019-09-27 16:33:17
    我们的服务在接口中可能会调用一个函数,而这个函数运行的状态我们需要在另外一个接口查看,celery需要消息队列,但是过于复杂,对于不适用消息队列的服务,我们就需要一个异步操作,开启了那个异步的任务,但是...
  • python 实现异步任务最常见的工具是celery,此次使用flask和celery完成了功能,将实践结果进行记录。 celery Celery是Python开发的分布式任务调度模块,可以执行异步任务和定时任务。 详细内容可以查看官网的文档 ...
  • asyn_task 批量上传或下载异步处理任务的工具 运行命令pip install asyn_task

空空如也

空空如也

1 2 3 4 5
收藏数 93
精华内容 37
关键字:

flask异步操作