异步实现:client发请求get服务端HTTPweb数据--基于aiohttp、Keydb、FlaskAPI框架实现
(2024-08-11 03:21:51)
标签:
clienthttpweb服务keydbaiohttp |
分类: 接口类的哈 |
关于异步,计算机无学,你知道就是知道知不道就拉到,判断不出你的认知也反应不出来你的天资,TMD就是吓唬造出来的 :规定。
所有的规定,都是无学的。debug就行。就是你是个烂人你也可以会,你是个天使你也能摔死,嘎嘎~~~
你也不用责难自己嘎嘎,多看看就行啦,
总体一个大概 关于协程级别的异步:
importasyncio
和
函数定义def前加上async
函数调用前加上 await
就异步了。
然:打掉async 、 await,其他和原始写法,因该是一样的,原则上单个程序,顺序执行你的for itm in itms,一样跑,就是慢点。
其他关于什么玩意多出来的 ,都是那个造包的人,也不大会啥,不大知道统一处理,或者不大集成吧,哈哈指责不了嘎嘎,出来貌似他感觉有条理的内容,多出来什么with等们语句,这难道不是终极优化应该是封装里面,更好吗。
也许不是,但是不作为 会与不会 协程理念的根本。 这都不重要,更新迭代,或者一浪一浪的就死翘翘了~~也许
async def fetch_data(url, params):
async with aiohttp.ClientSession() as session:
async with session.get(url, params=params) as response:
0、ToKeyDB.py![]()
没变,上篇没有贴过来代码,这里完整写入自己本地redis服务的(别吓唬晕,我这里是一会redis一会Keydb的,一样的, 都是本地docker起的keydb数据库服务,代指keydb这同一个东西。
统统改为keydb就行,只有redis.Redis之流 不能换,是引用redis 包中的 Redis 类的意思)。此处大概就是keydb是redis的一个分支,没名没姓的。
让大聪明给你们来:

通常来说,keydb 并不是一个标准的 Python 包名称。KeyDB 是一种兼容 Redis 的数据库,但通常还是通过 redis Python 客户端库来进行连接和操作。
所以,即使是连接到一个 KeyDB 实例,代码中通常仍然会使用 redis.Redis 类。
别给弄懵了,天使们~~~
import redis
import json
# 连接到 Redis/KeyDB
redis_client = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)
# 给定的数据
factor_datas ={
"600000.SH.GG:D:YZ0015:YZ0015_value": {"code": "YZ0015_value", "key": "600000.SH.GG:D:YZ0015:YZ0015_value",
"value": [
{'tr_date': '20240809', 'YZ0015_value': 0}, {'tr_date': '20240808', 'YZ0015_value': 0},
{'tr_date': '20240807', 'YZ0015_value': 1}, {'tr_date': '20240806', 'YZ0015_value': 0},
{'tr_date': '20240805', 'YZ0015_value': 0}, {'tr_date': '20240804', 'YZ0015_value': 1},
{'tr_date': '20240803', 'YZ0015_value': 1}, {'tr_date': '20240802', 'YZ0015_value': 0},
{'tr_date': '20240801', 'YZ0015_value': 0}, {'tr_date': '20240731', 'YZ0015_value': 0},
{'tr_date': '20240730', 'YZ0015_value': 1}, {'tr_date': '20240729', 'YZ0015_value': 0},
{'tr_date': '20240728', 'YZ0015_value': 1}, {'tr_date': '20240727', 'YZ0015_value': 1},
{'tr_date': '20240726', 'YZ0015_value': 1}, {'tr_date': '20240725', 'YZ0015_value': 1},
{'tr_date': '20240724', 'YZ0015_value': 0}, {'tr_date': '20240723', 'YZ0015_value': 0},
{'tr_date': '20240722', 'YZ0015_value': 0}, {'tr_date': '20240721', 'YZ0015_value': 0},
{'tr_date': '20240720', 'YZ0015_value': 0}, {'tr_date': '20240719', 'YZ0015_value': 0},
{'tr_date': '20240718', 'YZ0015_value': 0}, {'tr_date': '20240717', 'YZ0015_value': 1},
{'tr_date': '20240716', 'YZ0015_value': 1}, {'tr_date': '20240715', 'YZ0015_value': 1},
{'tr_date': '20240714', 'YZ0015_value': 0}, {'tr_date': '20240713', 'YZ0015_value': 0},
{'tr_date': '20240712', 'YZ0015_value': 0}, {'tr_date': '20240711', 'YZ0015_value': 1},
{'tr_date': '20240710', 'YZ0015_value': 0}, {'tr_date': '20240709', 'YZ0015_value': 1},
{'tr_date': '20240708', 'YZ0015_value': 1}, {'tr_date': '20240707', 'YZ0015_value': 1},
{'tr_date': '20240706', 'YZ0015_value': 1}]
},
"600000.SH:W:YZ0014:YZ0014_value": {"code": "YZ0014_value", "key": "600000.SH:W:YZ0014:YZ0014_value",
"value": [
{'tr_date': '20240809', 'YZ0014_value': 0},
{'tr_date': '20240808', 'YZ0014_value': 0},
{'tr_date': '20240807', 'YZ0014_value': 1},
{'tr_date': '20240806', 'YZ0014_value': 0},
{'tr_date': '20240805', 'YZ0014_value': 0},
{'tr_date': '20240804', 'YZ0014_value': 1},
{'tr_date': '20240803', 'YZ0014_value': 1},
{'tr_date': '20240802', 'YZ0014_value': 0},
{'tr_date': '20240801', 'YZ0014_value': 0},
{'tr_date': '20240731', 'YZ0014_value': 0},
{'tr_date': '20240730', 'YZ0014_value': 1},
{'tr_date': '20240729', 'YZ0014_value': 0},
{'tr_date': '20240728', 'YZ0014_value': 1},
{'tr_date': '20240727', 'YZ0014_value': 1},
{'tr_date': '20240726', 'YZ0014_value': 1},
{'tr_date': '20240725', 'YZ0014_value': 1},
{'tr_date': '20240724', 'YZ0014_value': 0},
{'tr_date': '20240723', 'YZ0014_value': 0},
{'tr_date': '20240722', 'YZ0014_value': 0},
{'tr_date': '20240721', 'YZ0014_value': 0},
{'tr_date': '20240720', 'YZ0014_value': 0},
{'tr_date': '20240719', 'YZ0014_value': 0},
{'tr_date': '20240718', 'YZ0014_value': 0},
{'tr_date': '20240717', 'YZ0014_value': 1},
{'tr_date': '20240716', 'YZ0014_value': 1},
{'tr_date': '20240715', 'YZ0014_value': 1},
{'tr_date': '20240714', 'YZ0014_value': 0},
{'tr_date': '20240713', 'YZ0014_value': 0},
{'tr_date': '20240712', 'YZ0014_value': 0},
{'tr_date': '20240711', 'YZ0014_value': 1},
{'tr_date': '20240710', 'YZ0014_value': 0},
{'tr_date': '20240709', 'YZ0014_value': 1},
{'tr_date': '20240708', 'YZ0014_value': 1},
{'tr_date': '20240707', 'YZ0014_value': 1},
{'tr_date': '20240706', 'YZ0014_value': 1}],
},
"600000.SH:GG:D:YZ0015:YZ0015_value": {"code": "YZ0014_value", "key": "600000.SH:GG:D:YZ0015:YZ0015_value",
"value": [{'tr_date': '20240809', 'YZ0015_value': 0},
{'tr_date': '20240808', 'YZ0015_value': 0},
{'tr_date': '20240807', 'YZ0015_value': 1},
{'tr_date': '20240806', 'YZ0015_value': 0},
{'tr_date': '20240805', 'YZ0015_value': 0},
{'tr_date': '20240804', 'YZ0015_value': 1},
{'tr_date': '20240803', 'YZ0015_value': 1},
{'tr_date': '20240802', 'YZ0015_value': 0},
{'tr_date': '20240712', 'YZ0015_value': 0},
{'tr_date': '20240711', 'YZ0015_value': 1},
{'tr_date': '20240710', 'YZ0015_value': 0},
{'tr_date': '20240709', 'YZ0015_value': 1},
{'tr_date': '20240708', 'YZ0015_value': 1},
{'tr_date': '20240707', 'YZ0015_value': 1},
{'tr_date': '20240706', 'YZ0015_value': 1}],
},
"600256.SH.GG:D:YZ0020:YZ0020_value": {
"code": "YZ0020_value",
"key": "600256.SH.GG:D:YZ0020:YZ0020_value",
"value": [
{
"tr_date": 20240727,
"YZ0010_value": 1
},
{
"tr_date": 20240726,
"YZ0010_value": 1
}
]
},
"600256.SH.GG:W:YZ0014:YZ0014_value": {
"code": "YZ0014_value",
"key": "600256.SH.GG:W:YZ0014:YZ0014_value",
"value": [
{
"tr_date": 20240727,
"YZ0014_value": 1
},
{
"tr_date": 20240726,
"YZ0014_value": 1
}
]
},
"603311.SH.GG:D:YZ0010:YZ0010_value": {
"code": "YZ0010_value",
"key": "603311.SH.GG:D:YZ0010:YZ0010_value",
"value": [
{
"tr_date": 20240728,
"YZ0010_value": 1
},
{
"tr_date": 20240729,
"YZ0010_value": 1
}
]
}
}
# factor_datas = json.dumps(factor_datas)
# 存储数据到KeyDB
for key, data in factor_datas.items():
# 为每个数据项创建一个唯一的hash key
hash_key = f"factor_datas:{key}"
# 使用hmset将所有相关数据存入hash结构中
# 注意:hmset已经在新版本的redis-py中被弃用,推荐使用hset
for sub_key, value in data.items():
if isinstance(value, list):
# 将列表转换为字符串形式存储
value = str(value)
redis_client.hset(hash_key, sub_key, value)
print(f"Data for {hash_key} stored successfully.")
# 验证数据存储
for key in factor_datas.keys():
hash_key = f"factor_datas:{key}"
retrieved_data = redis_client.hgetall(hash_key)
print(f"Data retrieved for {hash_key}: {retrieved_data}")
# 特别取出 '600000.SH.GG:D:YZ0015:YZ0015_value' 键的数据
specific_key = "factor_datas:600000.SH.GG:D:YZ0015:YZ0015_value"
specific_data = redis_client.hgetall(specific_key)
print(f"Specific data retrieved for {specific_key}: {specific_data}")
1、服务器端,httpFastServer.py
import json
import redis
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
app = FastAPI()
keydb = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)
@app.get('/getdata')
async def get_data(request: Request):
key = request.query_params.get('key', 'default_key')
data = await async_get_data_from_store(key)
if data:
aa=JSONResponse({"data": data})
return aa
else:
print(key)
return JSONResponse({"status": "error", "message": "Key not found"}, status_code=404)
async def async_get_data_from_store(key):
data = keydb.hgetall(key)
if data and 'value' in data:
try:
if isinstance(data['value'], str):
# data['value'] = json.loads(data['value'])
data =data
except json.JSONDecodeError:
return {"status": "error", "message": "Failed to decode JSON data"}
return data
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=8000, log_level="info")
2、client端 httpClientAiohttp.py![]()
import json
from flask import Flask, request, jsonify
import redis
import requests
import aiohttp
import asyncio
# 连接到 Redis/KeyDB
# redis_client = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)
# 定义变量
stock_code = "600000.SH:GG"
date_type = "D"
factor_code = "YZ0015"
result_code = "YZ0015_value"
dynamic_key = f"factor_datas:{stock_code}:{date_type}:{factor_code}:{result_code}"
params = {'key': dynamic_key} #构建需要的key,传参,替代服务器端,默认的请求key
async def fetch_data(url, params):
async with aiohttp.ClientSession() as session:
async with session.get(url, params=params) as response:
return await response.json()
async def main():
url = 'http://127.0.0.1:8000/getdata'
params = {'key': 'factor_datas:600000.SH.GG:D:YZ0015:YZ0015_value'}
data = await fetch_data(url, params)
print(data)
if __name__ == '__main__':
asyncio.run(main())
当然 实现服务端 开启服务,客户端灵活请求数据,有更好的办法(适应高并发模式):
‘’服务部署一个连接集群的,基于我给的那个redisserver
aiohttp发送请求就能获得key对应的值
client 样例应该也写了‘’
————————————————
重点在集群、服务、client 弄个入流的升级版 高并发获取方式,
备注:此处异步 还是单机 redis本地模拟服务器,开启的http服务,没有集群这一说。
然被留言:docker集群大概率本地单机 还不行,
咱不知道还 属于蒙状态, 试试才可以瞎胡说~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

加载中…