kaq-quant-common 0.1.91__py3-none-any.whl → 0.1.92__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -27,7 +27,7 @@ class KaqQuantDdbStreamInitRepository:
27
27
  '''
28
28
  self.session = ddb.session(enableASYNC=True)
29
29
  self.session.connect(host, port, user, passwd)
30
- self.session.enableStreaming()
30
+ # self.session.enableStreaming()
31
31
 
32
32
  '''
33
33
  创建流数据表 && 创建引擎
@@ -23,7 +23,7 @@ class KaqQuantDdbStreamReadRepository:
23
23
  self.session = ddb.session(enableASYNC=False)
24
24
  self.session.setTimeout(3600)
25
25
  self.session.connect(host, port, user, passwd, keepAliveTime=240, reconnect=True, tryReconnectNums=10)
26
- self.session.enableStreaming()
26
+ # self.session.enableStreaming()
27
27
 
28
28
  # 需要注意的是 fetchSize 取值不能小于 8192 (记录条数)
29
29
  self.size = 8192
@@ -1,4 +1,5 @@
1
1
  import os
2
+ import queue
2
3
  import time
3
4
  import dolphindb as ddb
4
5
  from kaq_quant_common.utils import yml_utils
@@ -6,6 +7,7 @@ import pandas as pd
6
7
  import threading
7
8
  from kaq_quant_common.utils.logger_utils import get_logger
8
9
  import traceback
10
+ from typing_extensions import deprecated
9
11
 
10
12
  mutex = threading.Lock()
11
13
 
@@ -22,7 +24,8 @@ class KaqQuantDdbStreamWriteRepository:
22
24
  mutex.acquire()
23
25
  self.session = ddb.session(enableASYNC=True)
24
26
  self.session.connect(host, port, user, passwd, tryReconnectNums=10, reconnect=True, keepAliveTime=1000, readTimeout=10, writeTimeout=5)
25
- self.session.enableStreaming(threadCount=5)
27
+ # 流表订阅用的
28
+ # self.session.enableStreaming(threadCount=5)
26
29
  # self.pool = ddb.DBConnectionPool(host, port, userid=user, password=passwd, loadBalance=True, reConnect=True, tryReconnectNums=5, sqlStd=SqlStd.MySQL)
27
30
 
28
31
  # 需要注意的是 fetchSize 取值不能小于 8192 (记录条数)
@@ -84,6 +87,114 @@ class KaqQuantDdbStreamWriteRepository:
84
87
  self.logger.warning(f'KaqQuantDdbStreamWriteRepository.save2stream cost time is only write : {end - start2} ns, save2stream_batch :{end - start1} ns, batch size is {len(df)}, tableName is {ddb_table_name}')
85
88
  except Exception as e:
86
89
  self.logger.error(f'KaqQuantDdbStreamWriteRepository.save2stream_batch is occured error: tableName is {ddb_table_name} - {str(e)} - {str(traceback.format_exc())}')
90
+
91
+
92
+ class DDBAsyncDFWriter:
93
+ def __init__(self, appender, batch_size=1000, flush_interval_ms=80):
94
+ self.logger = get_logger()
95
+ self.appender = appender
96
+ self.batch_size = batch_size
97
+ self.flush_interval = flush_interval_ms / 1000.0
98
+
99
+ self.queue = queue.Queue(maxsize=10000)
100
+ self.running = True
101
+
102
+ self.thread = threading.Thread(target=self._worker, daemon=True)
103
+ self.thread.start()
104
+
105
+ def add_df(self, df):
106
+ """直接传入一个 DataFrame"""
107
+ if not self.running:
108
+ return
109
+ if df is None or df.empty:
110
+ return
111
+ try:
112
+ self.queue.put(df, block=False)
113
+ except queue.Full:
114
+ self.logger.error("Warning: DDBAsyncDFWriter queue is full!")
115
+
116
+ def _worker(self):
117
+ buffer = []
118
+ current_rows = 0
119
+ last_flush_time = time.time()
120
+
121
+ while self.running or not self.queue.empty():
122
+ try:
123
+ # 使用较短的 timeout 以便能快速响应 running=False 状态
124
+ df = self.queue.get(timeout=0.01)
125
+ buffer.append(df)
126
+ current_rows += len(df)
127
+ except queue.Empty:
128
+ # 即使没有新数据,如果已经进入停止流程且 buffer 还有数,也要处理
129
+ if not self.running and not buffer:
130
+ break
131
+
132
+ now = time.time()
133
+ # 触发条件:行数够了,或时间到了,或者程序正在停止
134
+ if buffer and (current_rows >= self.batch_size or
135
+ (now - last_flush_time) >= self.flush_interval or
136
+ not self.running):
137
+ self._do_flush(buffer)
138
+ buffer = []
139
+ current_rows = 0
140
+ last_flush_time = now
141
+
142
+ def _do_flush(self, buffer):
143
+ try:
144
+ if not buffer:
145
+ return
146
+ final_df = pd.concat(buffer, ignore_index=True)
147
+ self.appender.append(final_df)
148
+ except Exception as e:
149
+ self.logger.error(f"DolphinDB 写入异常: {e}")
150
+
151
+ def stop(self):
152
+ """
153
+ 优雅停止:
154
+ 1. 设置 running 为 False
155
+ 2. 等待后台线程把队列里剩余的数据全部 flush 完
156
+ """
157
+ self.logger.warning("正在停止 DDBAsyncDFWriter 并清空残留数据...")
158
+ self.running = False
159
+ self.thread.join() # 等待工作线程处理完最后一批 buffer
160
+ self.logger.info("DDBAsyncDFWriter 已安全停止。")
161
+
162
+ class KaqQuantDdbStreamWriteSyncRepository:
163
+ '''
164
+ 使用appender直接写入的方式
165
+ '''
166
+ def __init__(self, host, port, user, passwd, tableName=None):
167
+ if tableName is None:
168
+ raise ValueError(f'Error tableName, please set. tableName={tableName}')
169
+ self.tableName = tableName
170
+ self.logger = get_logger(self)
171
+ '''
172
+ 创建ddb连接 && 添加ddb流数据表支持
173
+ '''
174
+ try:
175
+ mutex.acquire()
176
+ self.session = ddb.session()
177
+ self.session.connect(host, port, user, passwd, tryReconnectNums=10, reconnect=True, keepAliveTime=1000, readTimeout=10, writeTimeout=5)
178
+
179
+ self.batch_writer = DDBAsyncDFWriter(ddb.TableAppender(table_name=self.tableName, conn=self.session))
180
+ # 需要注意的是 fetchSize 取值不能小于 8192 (记录条数)
181
+ self.size = 8192
182
+ except Exception as e:
183
+ self.logger.error(f'KaqQuantDdbTableStreamWriteRepository.__init__ is occured error: {str(e)} - {str(traceback.format_exc())}')
184
+ finally:
185
+ mutex.release()
186
+
187
+ @deprecated("请确保pandas数据与ddb表的数据类型一致.")
188
+ def insert(self, df : pd.DataFrame):
189
+ '''
190
+ dataframe中日期等类型与ddb流表中一致,例如:
191
+ df['create_time'] = pd.to_datetime(df['create_time'], unit='ms')
192
+ df['event_time'] = pd.to_datetime(df['event_time'], unit='ms')
193
+ '''
194
+ try:
195
+ self.batch_writer.add_df(df)
196
+ except Exception as e:
197
+ self.logger.error(f'KaqQuantDdbTableStreamWriteRepository.insert is occured error: {str(e)} - {str(traceback.format_exc())}')
87
198
 
88
199
 
89
200
  if __name__ == '__main__':
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kaq_quant_common
3
- Version: 0.1.91
3
+ Version: 0.1.92
4
4
  Summary:
5
5
  Author: kevinfuture
6
6
  Author-email: liuenbofuture@foxmail.com
@@ -39,9 +39,9 @@ kaq_quant_common/common/ws_wrapper.py,sha256=JNJ0CIjDXgCsRjOLSbCi7ysYDHw7tT_aK7V
39
39
  kaq_quant_common/config/config.yaml,sha256=ST_QBLo7kwVaoNOvuN3mpeSF7LPNSWdD7EjxrBYZYBs,230
40
40
  kaq_quant_common/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  kaq_quant_common/resources/kaq_ddb_pool_stream_read_resources.py,sha256=Y-rtGpBF3bNh2mPZ2Lze6D9JZnpkqh24OEh7okikh1w,2536
42
- kaq_quant_common/resources/kaq_ddb_stream_init_resources.py,sha256=0FY0cmqedrLSYoaHJah2QiO0L7l3lsQJzIfXXpd9WSQ,3347
43
- kaq_quant_common/resources/kaq_ddb_stream_read_resources.py,sha256=yqeruZELmxAKjVsdnZ7ieAeV3Wt7KpFYJdt8Vn_Y_qA,3163
44
- kaq_quant_common/resources/kaq_ddb_stream_write_resources.py,sha256=pebBaDypkY6Mn--Od5Wh1_ZfHewbQH3ce_JsfiWsyl4,4139
42
+ kaq_quant_common/resources/kaq_ddb_stream_init_resources.py,sha256=0MxxbajocTFzcRD344rfZQPKOwwuqCbyoT6dQpIox-o,3349
43
+ kaq_quant_common/resources/kaq_ddb_stream_read_resources.py,sha256=WShsXMoL8o-JZvrtAd7H2Cg-vrE47QbsdGgURaQwiZs,3165
44
+ kaq_quant_common/resources/kaq_ddb_stream_write_resources.py,sha256=RUWaonAnTSNQlSXnrdhrD4VHEueT0UN2kgG6dKoec04,8524
45
45
  kaq_quant_common/resources/kaq_mysql_init_resources.py,sha256=UcqWey6LgoMqvLq1SxK33nS6-rkViGYhzUPxcrucOks,827
46
46
  kaq_quant_common/resources/kaq_mysql_resources.py,sha256=UYBFn-o_fFaNwG6bT2E7CYdsns82EmR4ve2XgC9wFJw,13452
47
47
  kaq_quant_common/resources/kaq_postgresql_resources.py,sha256=iG1eYkciI0xUIBdEpGqKGOLBFxvVrfbBoTuaOmhQ0v0,1762
@@ -61,6 +61,6 @@ kaq_quant_common/utils/signal_utils.py,sha256=zBSyEltNTKqkQCsrETd47kEBb3Q_OWUBUn
61
61
  kaq_quant_common/utils/sqlite_utils.py,sha256=UDDFKfwL0N-jFifl40HdyOCENh2YQfW5so6hRaSJpv0,5722
62
62
  kaq_quant_common/utils/uuid_utils.py,sha256=pm_pnXpd8n9CI66x3A20cOEUiriJyqHaKGCeLrgkBxU,71
63
63
  kaq_quant_common/utils/yml_utils.py,sha256=gcKjb_-uuUajBGAl5QBPIZTg2wXm7qeeJvtHflj_zOE,4513
64
- kaq_quant_common-0.1.91.dist-info/METADATA,sha256=9ojNBXlJU6gHrFNcTNlpsrjjyfwXAaUu4OL1NJ0hlvM,1971
65
- kaq_quant_common-0.1.91.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
66
- kaq_quant_common-0.1.91.dist-info/RECORD,,
64
+ kaq_quant_common-0.1.92.dist-info/METADATA,sha256=_LDEPTc7fW8A3pP2WmwrFjD86MF_yZSR1zbrATVLmUo,1971
65
+ kaq_quant_common-0.1.92.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
66
+ kaq_quant_common-0.1.92.dist-info/RECORD,,