关于sanic请求异步非阻塞请求的方案

最近用sanic的搭建一个服务,与寻常业务不同的是,要求请求发送之后 立即响应,同时后台异步处理业务,又要求支持并发,又不想添加消息队列的中间件。

多方查询,最后找到了两种方案:

方案一:

在业务层代码是这么写的:

async def post(self,request):
    myloop = request.app.loop
    myloop.create_task(testFunc(request.json))
    return json({'msg':'执行成功'})

查找过很多方案的小伙伴,应该知道这块内容,创建一个loop将任务放进loop中,然后执行,当遇到IO操作时,执行其它任务。这里有一个问题,如果不遇到IO操作,第一个请求 会一直处理,此时第二个请求过来之后 需要等第一个请求处理完 才会返回。最后pass掉了 这个方案。

方案二:

代码一:在sanic服务启动时,创建一个队列对象,dada

class client(object):
    def __init__(self,queue):
        self.queue = queue
    def send(self,param):
        self.queue.put_nowait(param)


@app.main_process_start
async def start(app):
    manager = Mananger()
    app.shared_ctx.queue = manager.Queue()

@app.main_process_ready
async def ready(app):
    app.manager.manage('worker',testFunc,{'queue':app.shared_ctx.queue})

@app.after_server_start
async def setup_client(app):
    app.ctx.client = client(app.shared_ctx.queue)

代码二:接收到请求后,往队列发送消息,然后立即返回

class TestFunc(HTTPMethodView):
    
    async def post(self,request):
        request.app.ctx.client.send(request.json)
        return json({'msg':'hello process'})

代码三:sanic服务启动时候,执行testFunc方法,写个死循环,不停的遍历queue队列。

def testFunc(queue):
    while True:
        if not queue.empty():
            #执行的内容
        pass
    return None

看懂了吧 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
同步非阻塞异步非阻塞是两种不同的函数调用方式。 同步非阻塞是指在发起函数调用后,调用方不会等待函数的结果返回,而是立即继续执行后续的代码。这意味着调用方无需等待函数的执行结果,可以继续处理其他任务。当函数执行完毕后,调用方可以通过轮询或者回调等方式来获取函数的结果。同步非阻塞的优点是能够提高系统的并发性和响应性。 异步非阻塞是指在发起函数调用后,调用方也不会等待函数的结果返回,但是与同步非阻塞不同的是,异步非阻塞会通过回调、事件通知等方式来通知调用方函数的执行结果。调用方可以继续执行其他任务,并在合适的时机处理函数的返回结果。异步非阻塞的优点是能够提高系统的并发性和性能,减少资源的浪费。 总结来说,同步非阻塞异步非阻塞都是在函数调用时不会发生线程阻塞的情况下继续执行后续代码,但区别在于同步非阻塞需要主动轮询或回调来获取函数的结果,而异步非阻塞则通过回调或事件通知等方式传递函数的执行结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [深入理解同步阻塞、同步非阻塞异步阻塞、异步非阻塞](https://blog.csdn.net/wangpaiblog/article/details/117236684)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值