天天看点

江湖小白之进阶篇 (三)实现Sanic异步非阻塞并行请求

江湖小白之进阶篇 (三)实现Sanic异步非阻塞并行请求

      随着副业如火如荼的进行,给我们这些挣扎在底层的人们极大的改善了生活条件,感谢政府,感谢党,开展副业的同时也不能忘记自己的老本行,利用抽会儿烟的时间,接着上篇来实现Sanic异步非阻塞并行请求。

      我们在Sanic框架中请求访问的时候发现是一些问题,意思就是当你发起第一个请求的时候,在请求中你加入了类似time.sleep(5)阻塞主线程的方法,你同时又去发起第二个请求,但第二个请求要等待第一个请求结束后也就是5秒后才执行,那万一第一个请求执行的时间过长,那其它请求就在苦苦等待,这在正式的操作环境中是不允许的,那我们怎么解决这个,接下来就是我们要实现的异步非阻塞请求,我们便于测试先创建一个名为test.py的测试文件,看下正常的执行方法:

# coding:utf-8
import time
from sanic import Sanic
from sanic.response import text

# 初始化
app = Sanic(__name__)

async def task_sleep():
    while True:
        time.sleep(5)
        print("执行中……")

# 定义路由实现首页显示
@app.route("/")
async def index(request):
    await task_sleep()
    return text("你好,美女!")


if __name__ == "__main__":
    app.run(host="127.0.0.1", port=5000, debug=True)
           

我们添加一个task_sleep的方法,方法中我们加入了延迟5秒,在首页方法函数中引入,这里要注意的是要引入异步函数,我们在前面要加个await,我们运行看看,打开浏览器开发者工具:

江湖小白之进阶篇 (三)实现Sanic异步非阻塞并行请求

大家可以看到,在这个请求中一直在等待当中,这显然不是我们想要的,那我们根据官方的方法改动下:

# 定义路由实现首页显示
@app.route("/")
async def index(request):
    app.add_task(task_sleep())
    return text("你好,美女!")
           

add_task:官方的解释是在循环开始后,安排任务稍后运行。你可以理解将task_sleep方法放到了后台执行,我们运行看看结果:

江湖小白之进阶篇 (三)实现Sanic异步非阻塞并行请求

可以看到通过上面的修改就实现了请求的异步执行,那问题又来了,这样看着貌似很完美,但我们发现如果同时执行2个请求,我们会发现,第二个请求一直在请求等待中,无法达到接口并行请求:

江湖小白之进阶篇 (三)实现Sanic异步非阻塞并行请求

那这个问题怎么处理呢,通过查看一些资料和方法,可能水平有限,没发现sanic本身有什么方法能处理,其它的处理方式都是使用了asyncio库,我们这样修改下:

# coding:utf-8
import time,asyncio
from sanic import Sanic
from sanic.response import text

# 初始化
app = Sanic(__name__)

async def task_sleep():
    while True:
        await asyncio.sleep(5)
        print("执行中……")

# 定义路由实现首页显示
@app.route("/")
async def index(request):
    app.add_task(task_sleep())
    return text("你好,美女!")


if __name__ == "__main__":
    app.run(host="127.0.0.1", port=5000, debug=True)
           

使用 await asyncio.sleep(5)来替代time.sleep(5),来,我们继续测试看下:

江湖小白之进阶篇 (三)实现Sanic异步非阻塞并行请求

控制台打印:

江湖小白之进阶篇 (三)实现Sanic异步非阻塞并行请求

这样我们就实现了异步非阻塞并行的请求,嗯感觉很完美,这里你可能不会发现,但在实际的开发过程中,你会发现这里是用asyncio.sleep(5)实现延迟来测试后台任务,那在实际开发中,比如说我们提取PDF有100多页,这个执行的过程可能要花数分钟的时间,我们在这个PDF处理的方法中并没有加入sleep()延迟这类的方法,那我们怎样让这个方法在后台运行而且能实现并行的请求而不阻塞呢?

这里会用到asyncio中的ensure_future方法,这里我们就先提及一下这个问题,在后面的调用提取PDF的方法中我们会用到这个,这里我发个对比图看下大家就能明白:

未并行处理 并行处理
江湖小白之进阶篇 (三)实现Sanic异步非阻塞并行请求
江湖小白之进阶篇 (三)实现Sanic异步非阻塞并行请求
江湖小白之进阶篇 (三)实现Sanic异步非阻塞并行请求
江湖小白之进阶篇 (三)实现Sanic异步非阻塞并行请求

从上面的运行结果看,第一个是等任务执行完成后才去执行加载图片请求的访问,第二个很明显是并行请求接口,一边获取一边加载图片。

好了,今天对Sanic异步非阻塞并行请求的实现方法就介绍到这里,下一节来实现websocket服务的搭建。

江湖小白之进阶篇 (三)实现Sanic异步非阻塞并行请求

开始要为晚上的地摊生意做准备了,欢迎广大人民群众提供一些喜欢的需求物品清单。

没有做不到,只有想不到。江湖不说再见,咱们下篇见!

江湖小白之进阶篇 (三)实现Sanic异步非阻塞并行请求

关注公众号,超越平凡才能成就自我