From f03eb72394a3fac097bb3ab1f956a83f99f7bd0e Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期四, 03 十一月 2022 17:11:37 +0800
Subject: [PATCH] 优化撤单与动态m值计算

---
 gpcode_manager.py |   65 +++++++++++++++++++++++++-------
 1 files changed, 50 insertions(+), 15 deletions(-)

diff --git a/gpcode_manager.py b/gpcode_manager.py
index 3c6c24c..bb59007 100644
--- a/gpcode_manager.py
+++ b/gpcode_manager.py
@@ -1,6 +1,7 @@
 """
 鑲$エ浠g爜绠$悊鍣�
 """
+import code
 import json
 import random
 import time
@@ -132,6 +133,7 @@
         return None
     return tool.to_price(decimal.Decimal(str(price)) * decimal.Decimal("1.1"))
 
+
 # 鑾峰彇璺屽仠浠�
 def get_limit_down_price(code):
     price = get_price_pre(code)
@@ -180,6 +182,38 @@
 def set_listen_code_by_pos(client_id, pos, code):
     redis_instance = __redisManager.getRedis()
     redis_instance.setex("listen_code-{}-{}".format(client_id, pos), tool.get_expire(), code)
+    # 鍚屾鐩戝惉鐨勪唬鐮侀泦鍚�
+    __sync_listen_codes_pos()
+
+
+# 鍚屾鐩戝惉浠g爜浣嶇疆淇℃伅
+def __sync_listen_codes_pos():
+    # 鑾峰彇宸茬粡姝e湪鐩戝惉鐨勪唬鐮�
+    keys = redis_instance.keys("code_listen_pos-*")
+    codes_set = set()
+    for key in keys:
+        codes_set.add(key.replace("code_listen_pos-", ""))
+
+    keys = redis_instance.keys("listen_code-*-*")
+
+    for key in keys:
+        result = redis_instance.get(key)
+        if result:
+            # 绉婚櫎闇�瑕佹坊鍔犵殑浠g爜
+            codes_set.discard(result)
+            client_id_, pos_, code_ = int(key.split("-")[1]), int(key.split("-")[2]), result
+            key_ = "code_listen_pos-{}".format(code_)
+            val = redis_instance.get(key_)
+            if val is None:
+                redis_instance.setex(key_, tool.get_expire(), json.dumps((client_id_, pos_)))
+            else:
+                val = json.loads(val)
+                if val[0] != client_id_ or val[1] != pos_:
+                    redis_instance.setex(key_, tool.get_expire(), json.dumps((client_id_, pos_)))
+
+    # 绉婚櫎娌℃湁鐩戝惉鐨勪唬鐮�
+    for code_ in codes_set:
+        redis_instance.delete(code_)
 
 
 # 鍒濆鍖栦綅缃�
@@ -227,18 +261,23 @@
 # 鑾峰彇姝e湪鐩戝惉鐨勪唬鐮佺殑浣嶇疆
 def get_listen_code_pos(code):
     redis_instance = __redisManager.getRedis()
-    keys = redis_instance.keys("listen_code-*-*")
-    for key in keys:
-        result = redis_instance.get(key)
-        if result is not None and code == result:
-            return key.split("-")[1], key.split("-")[2]
-    return None, None
+    val = redis_instance.get("code_listen_pos-{}".format(code))
+    if val is None:
+        return None, None
+    val = json.loads(val)
+    return val[0], val[1]
 
 
 # 鏄惁姝e湪鐩戝惉
 def is_listen(code):
-    codes = get_listen_codes()
-    return codes.__contains__(code)
+    redis_instance = __redisManager.getRedis()
+    val = redis_instance.get("code_listen_pos-{}".format(code))
+    if val is None:
+        return False
+    else:
+        return True
+    # codes = get_listen_codes()
+    # return codes.__contains__(code)
 
 
 # 鐩戝惉鏄惁婊′簡
@@ -267,10 +306,6 @@
 
 
 if __name__ == '__main__':
-    # print(get_can_listen_pos(0))
-    # print(get_listen_codes())
-    # print(is_listen_full())
-    # print(is_listen("002271"))
-    # print(get_listen_code_pos("002272"))
-    code = get_listen_code_by_pos(2, 7)
-    print(code)
+    _start = time.time()
+    is_listen("002703")
+    print( (time.time() - _start) * 1000)

--
Gitblit v1.8.0