[英]How to get the ip address of a request machine using python (On 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.