繁体   English   中英

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

[英]how to Async request in sanic parallel Work

我无法从此代码中释放主要的 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至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)

预期结果是并行发布所有内容。

我得到这个结果

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: '))

我希望有这样的东西

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 不是并行操作的灵丹妙药。 事实上,Sanic 也没有。 它所做的是有效地利用处理器来允许多个功能一次“推动球向前”一点点。

一切都在一个线程和一个进程中运行。

您遇到这种情况是因为您正在使用阻塞 HTTP 调用。 您应该使用异步兼容实用程序替换requests ,以便 Sanic 可以在传出操作发生时将请求放在一边以处理新请求。

看看这个:

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

一个常见的错误!

不要这样做。 你需要ping一个网站吗? 你用什么? pip install your-fav-request-library

相反,请尝试使用支持异步/等待的客户端。 你的服务器会感谢你的。 避免使用阻塞工具,而偏爱那些在异步生态系统中表现良好的工具。 如果您需要建议,请查看 Awesome Sanic

Sanic 在其测试 package (sanic-testing) 中使用 httpx。

暂无
暂无

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

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