Browse Source

设备搜索异步优化,提升速度

yf_fyh 2 years ago
parent
commit
b871ac756c
4 changed files with 65 additions and 58 deletions
  1. 2 2
      apps/Equipment/views.py
  2. 3 3
      apps/IOTCard/views.py
  3. 12 12
      crond_script/sim_info.py
  4. 48 41
      utils/utils.py

+ 2 - 2
apps/Equipment/views.py

@@ -6,7 +6,7 @@ from .serializers import SearchEquipSerializer, QxzDeviceDetailSerializer
 from utils.JWTAuthentication_diy import APIAuthentication
 from utils.permissions import QXZDeviceDetailPermission
 from utils.MyRateThrottle import QxzDeviceListRateThrottle, QxzDeviceDetailRateThrottle
-from utils.utils import get_equip_list
+from utils.utils import DeviceInfoUtils
 from utils.db_utils import MongoDBTools
 
 
@@ -17,7 +17,7 @@ class SearchEquip(APIView):
         serializer = SearchEquipSerializer(data=request.data)
         serializer.is_valid(raise_exception=True)
         request_data = serializer.validated_data
-        data = get_equip_list(
+        data = DeviceInfoUtils().get_equip_list(
             d_id=request_data.get("device_id"),
             isfullId=request_data.get("isfullId")
         )

+ 3 - 3
apps/IOTCard/views.py

@@ -16,7 +16,7 @@ from django.utils.encoding import escape_uri_path
 from .serializers import PlatSimInfoSerializer
 from .models import PlatSimInfo
 from utils.paginations import CustomPagination
-from utils.utils import get_equip_list, GetSIMInfo
+from utils.utils import DeviceInfoUtils, GetSIMInfo
 
 
 # Create your views here.
@@ -69,7 +69,7 @@ class PlatformIOTCardViewSet(viewsets.ModelViewSet):
         if self.get_queryset().filter(deviceId=device_id, input_type=2).exists():
             raise ValidationError("该设备已存在手动录入类型,请核查!")
 
-        device_info_list = get_equip_list(
+        device_info_list = DeviceInfoUtils().get_equip_list(
             d_id=device_id,
             isfullId=1
         )
@@ -289,7 +289,7 @@ class PlatformIOTCardViewSet(viewsets.ModelViewSet):
                     if card_queryset.exists():
                         card_obj = card_queryset.first()
                         deviceId = card_obj.deviceId
-                        device_info_list = get_equip_list(d_id=deviceId, isfullId=1)
+                        device_info_list = DeviceInfoUtils().get_equip_list(d_id=deviceId, isfullId=1)
                         if device_info_list:
                             device_info = device_info_list[0]
                             uptime = device_info["uptime"]

+ 12 - 12
crond_script/sim_info.py

@@ -15,7 +15,7 @@ from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED
 from django.conf import settings
 from apps.IOTCard.models import PlatSimInfo
 
-from utils.utils import GetSIMInfo, get_equip_list
+from utils.utils import GetSIMInfo, DeviceInfoUtils
 
 
 class SIMUpdate(object):
@@ -114,7 +114,7 @@ class SQ_SIMUpdate(object):
             scd_status = i["scd_status"]
             equip_status = ast.literal_eval(scd_status)
             iccid = equip_status.get("iccid","")
-            device_info = get_equip_list(d_id=device_id, isfullId=1)
+            device_info = DeviceInfoUtils().get_equip_list(d_id=device_id, isfullId=1)
             if device_info and device_info[0]["plat"]=="四情平台":
                 SIMUpdate(deviceId=device_id,iccid=iccid,device_type="杀虫灯",platform=1).zhuban_sim()
     
@@ -128,7 +128,7 @@ class SQ_SIMUpdate(object):
             photo_iccid = i["simid"]
             equip_status = ast.literal_eval(cbd_status)
             zhuban_iccid = equip_status.get("iccid","")
-            device_info = get_equip_list(d_id=device_id, isfullId=1)
+            device_info = DeviceInfoUtils().get_equip_list(d_id=device_id, isfullId=1)
             if device_info and device_info[0]["plat"]=="四情平台":
                 SIMUpdate(deviceId=device_id,iccid=zhuban_iccid,device_type="测报灯",platform=1).zhuban_sim()
                 if photo_iccid and photo_iccid != zhuban_iccid:
@@ -143,7 +143,7 @@ class SQ_SIMUpdate(object):
             xycb_status = i["ybq_status"]
             equip_status = ast.literal_eval(xycb_status)
             iccid = equip_status.get("iccid","")
-            device_info = get_equip_list(d_id=device_id, isfullId=1)
+            device_info = DeviceInfoUtils().get_equip_list(d_id=device_id, isfullId=1)
             if device_info and device_info[0]["plat"]=="四情平台":
                 SIMUpdate(deviceId=device_id,iccid=iccid,device_type="性诱测报",platform=1).zhuban_sim()
     
@@ -154,7 +154,7 @@ class SQ_SIMUpdate(object):
         for i in qxz_cursor:
             device_id = i["equip_id_id"]
             iccid = i["iccid"]
-            device_info = get_equip_list(d_id=device_id, isfullId=1)
+            device_info = DeviceInfoUtils().get_equip_list(d_id=device_id, isfullId=1)
             if device_info and device_info[0]["plat"]=="四情平台":
                 SIMUpdate(deviceId=device_id,iccid=iccid,device_type="气象站",platform=1).zhuban_sim()
     
@@ -168,7 +168,7 @@ class SQ_SIMUpdate(object):
             photo_iccid = i["simid"]
             equip_status = ast.literal_eval(bzy_status)
             zhuban_iccid = equip_status.get("iccid","")
-            device_info = get_equip_list(d_id=device_id, isfullId=1)
+            device_info = DeviceInfoUtils().get_equip_list(d_id=device_id, isfullId=1)
             if device_info and device_info[0]["plat"]=="四情平台":
                 SIMUpdate(deviceId=device_id,iccid=zhuban_iccid,device_type="孢子仪",platform=1).zhuban_sim()
                 if photo_iccid and photo_iccid != zhuban_iccid:
@@ -238,7 +238,7 @@ class BD_SIMUpdate(object):
         for i in scd_list:
             d_id = i["d_id"]
             device_id = i["device_id"]
-            device_info = get_equip_list(d_id=device_id, isfullId=1)
+            device_info = DeviceInfoUtils().get_equip_list(d_id=device_id, isfullId=1)
             if device_info and device_info[0]["plat"]=="大数据平台":
                 scd_data_cursor = self.scd_collection.find_one(
                     filter={
@@ -264,7 +264,7 @@ class BD_SIMUpdate(object):
             d_id = i["d_id"]
             device_id = i["device_id"]
             photo_iccid = i["simid"]
-            device_info = get_equip_list(d_id=device_id, isfullId=1)
+            device_info = DeviceInfoUtils().get_equip_list(d_id=device_id, isfullId=1)
             if device_info and device_info[0]["plat"]=="大数据平台":
                 cbd_data_cursor = self.cbd_collection.find_one(
                     filter={
@@ -293,7 +293,7 @@ class BD_SIMUpdate(object):
             photo_iccid = i["simid"]
             equip_status = ast.literal_eval(cbd_status)
             zhuban_iccid = equip_status.get("iccid","")
-            device_info = get_equip_list(d_id=device_id, isfullId=1)
+            device_info = DeviceInfoUtils().get_equip_list(d_id=device_id, isfullId=1)
             if device_info and device_info[0]["plat"]=="四情平台":
                 SIMUpdate(deviceId=device_id,iccid=zhuban_iccid,device_type="测报灯",platform=1).zhuban_sim()
                 SIMUpdate(deviceId=device_id,iccid=photo_iccid,device_type="测报灯",platform=1).photo_sim()
@@ -304,7 +304,7 @@ class BD_SIMUpdate(object):
         for i in xycb_list:
             d_id = i["d_id"]
             device_id = i["device_id"]
-            device_info = get_equip_list(d_id=device_id, isfullId=1)
+            device_info = DeviceInfoUtils().get_equip_list(d_id=device_id, isfullId=1)
             if device_info and device_info[0]["plat"]=="大数据平台":
                 xycb_data_cursor = self.xycb_collection.find_one(
                     filter={
@@ -337,7 +337,7 @@ class BD_SIMUpdate(object):
             for i in qxz_list_cursor:
                 device_id = i["device_id"]
                 iccid = i["iccid"]
-                device_info = get_equip_list(d_id=device_id, isfullId=1)
+                device_info = DeviceInfoUtils().get_equip_list(d_id=device_id, isfullId=1)
                 if device_info and device_info[0]["plat"]=="大数据平台":
                     SIMUpdate(deviceId=device_id,iccid=iccid,device_type="气象站",platform=2).zhuban_sim()
     
@@ -348,7 +348,7 @@ class BD_SIMUpdate(object):
             d_id = i["d_id"]
             device_id = i["device_id"]
             photo_iccid = i["simid"]
-            device_info = get_equip_list(d_id=device_id, isfullId=1)
+            device_info = DeviceInfoUtils().get_equip_list(d_id=device_id, isfullId=1)
             if device_info and device_info[0]["plat"]=="大数据平台":
                 bzy_data_cursor = self.bzy_collection.find_one(
                     filter={

+ 48 - 41
utils/utils.py

@@ -3,47 +3,7 @@ import hashlib
 import time
 import requests
 from requests.auth import HTTPBasicAuth
-
-
-def get_equip_list(d_id, isfullId=0):
-    """
-    跨平台获取设备信息
-    :param d_id: 设备号
-    :param isfullId:0模糊匹配,1表示完整设备号匹配
-    :return:列表数据,相同设备号放一起,并且最近更新数据靠前,最近更新数据可认为设备最后所在平台
-    """
-    if isfullId == 1:
-        try:
-            bigdata_res = requests.post("http://127.0.0.1:8002/search/equip", data={"device_id": d_id, "isfullId": "1"},timeout=10)
-            bigdata_dict = json.loads(bigdata_res.content.decode())
-        except:
-            bigdata_dict = {}
-        try:
-            siqing_res = requests.post("http://172.16.220.3/search/equip", data={"device_id": d_id, "isfullId": "1"},timeout=10)
-            siqing_dict = json.loads(siqing_res.content.decode())
-        except:
-            siqing_dict = {}
-    else:
-        try:
-            bigdata_res = requests.post("http://127.0.0.1:8002/search/equip", data={"device_id": d_id}, timeout=10)
-            bigdata_dict = json.loads(bigdata_res.content.decode())
-        except:
-            bigdata_dict = {}
-        try:
-            siqing_res = requests.post("http://172.16.220.3/search/equip", data={"device_id": d_id}, timeout=10)
-            siqing_dict = json.loads(siqing_res.content.decode())
-        except:
-            siqing_dict = {}
-
-    django_data = bigdata_dict.get("data", [])
-    siqing_data = siqing_dict.get("data", [])
-    data = []
-    data.extend(django_data)
-    data.extend(siqing_data)
-
-    data = sorted(data, key=lambda e: e.__getitem__('uptime'), reverse=True)
-    data = sorted(data, key=lambda e: e.__getitem__('device_id'), reverse=True)
-    return data
+import asyncio
 
 
 class GetSIMInfo(object):
@@ -150,3 +110,50 @@ class GetSIMInfo(object):
                 data_balance = "未知"
                 expiry_date = "未知"
         return sim_operators,account_status,active_date,data_plan,data_usage,data_balance,expiry_date
+
+
+class DeviceInfoUtils(object):
+    """
+    跨平台异步获取设备信息,调用实例化本类中的get_equip_list()
+    :param d_id: 设备号
+    :param isfullId:0模糊匹配,1表示完整设备号匹配
+    :return:列表数据,相同设备号放一起,并且最近更新数据靠前,最近更新数据可认为设备最后所在平台
+    """
+    def get_resp(self, url, params):
+        try:
+            res = requests.post(url=url,data=params,timeout=10)
+            res_dict = json.loads(res.content.decode())
+        except:
+            res_dict = {}
+        return res_dict
+
+    async def plat_device_info(self, url, data):
+        loop = asyncio.get_event_loop()
+        res = await loop.run_in_executor(None, self.get_resp, url, data)
+        return res
+
+    def get_equip_list(self, d_id, isfullId=0):
+        bd_url = "http://127.0.0.1:8002/search/equip"
+        sq_url = "http://172.16.220.3/search/equip"
+        
+        if isfullId == 1:
+            data = {"device_id": d_id, "isfullId": "1"}
+        else:
+            data = {"device_id": d_id}
+
+        loop = asyncio.get_event_loop()
+        db_task = loop.create_task(self.plat_device_info(bd_url, data))
+        sq_task = loop.create_task(self.plat_device_info(sq_url, data))
+        loop.run_until_complete(db_task)
+        loop.run_until_complete(sq_task)
+        bd_dict = db_task.result()
+        sq_dict = sq_task.result()
+        loop.close()
+        bd_data = bd_dict.get("data", [])
+        sq_data = sq_dict.get("data", [])
+        data = []
+        data.extend(bd_data)
+        data.extend(sq_data)
+        data = sorted(data, key=lambda e: e.__getitem__('uptime'), reverse=True)
+        data = sorted(data, key=lambda e: e.__getitem__('device_id'), reverse=True)
+        return data