简体   繁体   English

如何在 sanic 并行工作中异步请求

[英]how to Async request in sanic parallel Work

Im not able to free the main function from this code so that tasks are completed in parallel and i can receive another get.我无法从此代码中释放主要的 function,以便并行完成任务,我可以收到另一个 get。

in this code when i open in chrome http://0.0.0.0:8082/envioavisos?test1=AAAAAA&test2=test the get_avisos_grupo() function is excecuted in secuence and not in parallel and untill the function ends and not able to send another request to http://0.0.0.0:8082/envioavisos?test1=AAAAAA&test2=test in this code when i open in chrome http://0.0.0.0:8082/envioavisos?test1=AAAAAA&test2=test the get_avisos_grupo() function is excecuted in secuence and not in parallel and untill the function ends and not able to send another request至http://0.0.0.0:8082/envioavisos?test1=AAAAAA&test2=test

#!/usr/bin/env python3
import asyncio
import time
from sanic import Sanic
from sanic.response import text
from datetime import datetime
import requests

avisos_ips = ['1.1.1.1','2.2.2.2']

app = Sanic(name='server')

async def get_avisos_grupo(ip_destino,test1,test2):
    try:
        try:
            print(datetime.now().strftime("%d/%m/%Y %H:%M:%S,%f"),'STEP 2',ip_destino)

            r = requests.post('http://{}:8081/avisosgrupo?test1={}&test2={}'.format(ip_destino,test1,test2), timeout=10)
            await asyncio.sleep(5)
        except Exception as e:
            print('TIME OUT',str(e))
            pass

    except Exception as e:
        print(str(e))
        pass


@app.route("/envioavisos", methods=['GET','POST'])
async def avisos_telegram_send(request): ## enviar avisos
    try:
        query_components = request.get_args(keep_blank_values=True)
        print(datetime.now().strftime("%d/%m/%Y %H:%M:%S,%f"),'>--------STEP 1',query_components['test1'][0])

        for ip_destino in avisos_ips:
            asyncio.ensure_future(get_avisos_grupo(ip_destino,query_components['test1'][0],query_components['test2'][0]))

    except Exception as e:
        print(str(e))
        pass
    print(datetime.now().strftime("%d/%m/%Y %H:%M:%S,%f"),'STEP 4')
    return text('ok')



if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8082, workers=4)

Expected result is to post everything in parallel.预期结果是并行发布所有内容。

I'm getting this result我得到这个结果

06/04/2021 16:25:18,669074 STEP 2 1.1.1.1
TIME OUT HTTPConnectionPool(host='1.1.1.1', port=8081): Max retries exceeded with url: '))
06/04/2021 16:25:28,684200 STEP 2 2.2.2.2
TIME OUT HTTPConnectionPool(host='2.2.2.2', port=8081): Max retries exceeded with url: '))

i expect to have something like this我希望有这样的东西

06/04/2021 16:25:18,669074 STEP 2 1.1.1.1
06/04/2021 16:25:28,684200 STEP 2 2.2.2.2
TIME OUT HTTPConnectionPool(host='1.1.1.1', port=8081): Max retries exceeded with url: '))
TIME OUT HTTPConnectionPool(host='2.2.2.2', port=8081): Max retries exceeded with url: '))

Asyncio is not a magic bullet that parallelizes operations. Asyncio 不是并行操作的灵丹妙药。 Indeed Sanic doesn't either.事实上,Sanic 也没有。 What it does is make efficient use of the processor to allow for multiple functions to "push the ball forward" a little at a time.它所做的是有效地利用处理器来允许多个功能一次“推动球向前”一点点。

Everything runs in a single thread and a single process.一切都在一个线程和一个进程中运行。

You are experiencing this because you are using a blocking HTTP call.您遇到这种情况是因为您正在使用阻塞 HTTP 调用。 You should replace requests with an async compatible utility so that Sanic can put the request aside to handle new requests while the outgoing operation takes place.您应该使用异步兼容实用程序替换requests ,以便 Sanic 可以在传出操作发生时将请求放在一边以处理新请求。

take a look at this:看看这个:

https://sanicframework.org/en/guide/basics/handlers.html#a-word-about-async https://sanicframework.org/en/guide/basics/handlers.html#a-word-about-async

A common mistake!一个常见的错误!

Don't do this.不要这样做。 You need to ping a website?你需要ping一个网站吗? What do you use?你用什么? pip install your-fav-request-library pip install your-fav-request-library

Instead, try using a client that is async/await capable.相反,请尝试使用支持异步/等待的客户端。 Your server will thank you.你的服务器会感谢你的。 Avoid using blocking tools, and favor those that play well in the asynchronous ecosystem.避免使用阻塞工具,而偏爱那些在异步生态系统中表现良好的工具。 If you need recommendations, check out Awesome Sanic如果您需要建议,请查看 Awesome Sanic

Sanic uses httpx inside of its testing package (sanic-testing). Sanic 在其测试 package (sanic-testing) 中使用 httpx。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM