当前位置:网站首页>自定义多线程基类threading.Event
自定义多线程基类threading.Event
2022-06-27 12:01:00 【於 兔シ】
使用场景概括
- 处理需要等待的任务可以配合asyncio.run完成异步任务。
- 处理多继承任务,且需要循环实例化类的操作
项目实例
一个websocket脚本
基类定义:
safe_stop_thread.py:
import threading
import time
from utils.logger import logger
class SafeStopThread(threading.Thread):
def __init__(self, loop_sleep_time=0):
self.stop_event = threading.Event() # 创建一个事件管理标志,该标志(event)默认为False
self.loop_sleep_time = loop_sleep_time
super().__init__()
logger.info('thread init finished')
def stop(self):
logger.info("Waiting for the last data push finished")
self.stop_event.set() # 将event的标志设置为True,调用wait方法的所有线程将被唤醒
def stopped(self):
return self.stop_event.is_set() # 判断event的标志是否为True
def run_once(self):
raise NotImplementedError
def run(self) -> None:
while not self.stopped():
try:
self.run_once()
except Exception as e:
logger.exception(e)
finally:
if self.loop_sleep_time:
time.sleep(self.loop_sleep_time)
log脚本封装
logger.py:
import functools
import logging
import os
import time
from logging import handlers
from pathlib import Path
class SafeTimedRotatingFileHandler(logging.handlers.TimedRotatingFileHandler):
def doRollover(self):
if self.stream:
self.stream.close()
self.stream = None
# get the time that this sequence started at and make it a time_tuple
current_time = int(time.time())
dst_now = time.localtime(current_time)[-1]
t = self.rolloverAt - self.interval
if self.utc:
time_tuple = time.gmtime(t)
else:
time_tuple = time.localtime(t)
dst_then = time_tuple[-1]
if dst_now != dst_then:
if dst_now:
addend = 3600
else:
addend = -3600
time_tuple = time.localtime(t + addend)
dfn = self.rotation_filename(self.baseFilename + "." +
time.strftime(self.suffix, time_tuple))
# 存在删除逻辑去掉
self.rotate(self.baseFilename, dfn)
if self.backupCount > 0:
for s in self.getFilesToDelete():
os.remove(s)
if not self.delay:
self.stream = self._open()
new_rollover_at = self.computeRollover(current_time)
while new_rollover_at <= current_time:
new_rollover_at = new_rollover_at + self.interval
# If DST changes and midnight or weekly rollover, adjust for this.
if (self.when == 'MIDNIGHT' or self.when.startswith('W')) and not self.utc:
dst_at_rollover = time.localtime(new_rollover_at)[-1]
if dst_now != dst_at_rollover:
if not dst_now: # DST kicks in before next rollover, so we need to deduct an hour
addend = -3600
else: # DST bows out before next rollover, so we need to add an hour
addend = 3600
new_rollover_at += addend
self.rolloverAt = new_rollover_at
def rotate(self, source, dest):
if not callable(self.rotator):
# 增加os.path.exists(dest),如果目标存在,不再rename
if os.path.exists(source):
if not os.path.exists(dest):
os.rename(source, dest)
else:
self.rotator(source, dest)
def setup_log(name=None):
log_formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(filename)s[%(lineno)d] - %(funcName)s - %(message)s ')
# file handler
log_dir = Path(__file__).parent.parent.joinpath('logs')
if not log_dir.is_dir():
log_dir.mkdir()
file_name = str(log_dir.joinpath(f"daily_log_{
name}.log").absolute())
file_handler = SafeTimedRotatingFileHandler(
file_name, when='MIDNIGHT', backupCount=0, encoding='utf8')
file_handler.setFormatter(log_formatter)
# stream handler
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(log_formatter)
g_logger = logging.getLogger()
g_logger.setLevel(logging.INFO)
if g_logger.handlers:
g_logger.handlers = list()
g_logger.addHandler(file_handler)
g_logger.addHandler(stream_handler)
return g_logger
class LogDecorator(object):
def __init__(self):
self.logger = logging.getLogger()
def __call__(self, fn):
@functools.wraps(fn)
def decorated(*args, **kwargs):
try:
self.logger.info("{0} - {1} - {2}".format(fn.__name__, args, kwargs))
result = fn(*args, **kwargs)
self.logger.info(result)
return result
except Exception as ex:
self.logger.info("Exception {0}".format(ex))
raise ex
return decorated
logger = setup_log('zmd') # zmd 项目日志简称
websocket 请求参数基类
ws_client.py:
import base64
import hashlib
import hmac
from datetime import datetime
from utils.logger import logger
class TalosBaseClient:
def __init__(self):
self.api_key = os.environ.get('WS_API_KEY') # 请求可能需要的参数
self.api_secret = os.environ.get('WS_API_SECRET') # 请求可能需要的参数
# sandbox环境
self.host = "ws.xxxx.com" # websocekt 请求地址
self.utc_datetime = datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.000000Z")
# 以下参数需要继承
self.path = ""
self.endpoint = ""
logger.info('client init finished')
def build_headers(self, path, query="", body="", method="GET", utc_datetime=None):
if not utc_datetime:
utc_now = datetime.utcnow()
utc_datetime = utc_now.strftime("%Y-%m-%dT%H:%M:%S.000000Z")
params = [
method,
utc_datetime,
self.host,
path,
]
if query:
params.append(query)
if body:
params.append(body)
payload = "\n".join(params)
hashvalue = hmac.new(
self.api_secret.encode('ascii'), payload.encode('ascii'), hashlib.sha256)
hashvalue.hexdigest()
signature = base64.urlsafe_b64encode(hashvalue.digest()).decode()
return {
"WS-KEY": self.api_key,
"WS-SIGN": signature,
"WS-TS": utc_datetime,
}
class TalosWebSocketClient(TalosBaseClient):
""" ws client process """
def __init__(self):
super().__init__()
self.path = "/ws/v1"
self.endpoint = f"wss://{
self.host}{
self.path}"
logger.info(self.endpoint)
self.header = self.build_headers(self.path)
logger.info(self.header)
websocket请求以及数据处理
暂时没有找到websocket的免费接口,后面更新talos.py:
import json
from datetime import datetime
from queue import Queue
import asyncio
import websockets
from clients.talos.talos_ws_client import TalosWebSocketClient
from clients.utils import logger
from utils.safe_stop_thread import SafeStopThread
data_queue = Queue()
class TalosWebSocketClientProcess(TalosWebSocketClient, SafeStopThread):
def __init__(self):
TalosWebSocketClient.__init__(self)
SafeStopThread.__init__(self)
async def ws_get_market_data_snapshot(self):
async with websockets.connect(self.endpoint, extra_headers=self.header, ping_timeout=120) as ws:
response = await ws.recv()
logger.info(f"ws-received: {
response}")
index_id = 0
await ws.send(json.dumps({
"reqid": index_id,
"type": "subscribe",
"ts": self.utc_datetime
}))
while True:
response = await ws.recv()
logger.info(f"ws-received: {
response}")
data_queue.put(response)
def run_once(self):
asyncio.run(self.ws_get_market_data_snapshot())
class DataUpdateProcess(SafeStopThread):
last_price_time = datetime.utcnow()
def __init__(self):
super().__init__()
def run_once(self):
data = data_queue.get()
self.process_data(data)
def process_data(self, data):
""" 处理放在队列里的数据 """
pass
if __name__ == '__main__':
talos_web_socket_client_process = TalosWebSocketClientProcess()
data_update_process = DataUpdateProcess()
talos_web_socket_client_process.start()
data_update_process.start()
talos_web_socket_client_process.join()
data_update_process.join()
定义一个简单的子类测试:
test.py:
import json
from datetime import datetime
from queue import Queue
import asyncio
import websockets
from clients.talos.talos_ws_client import TalosWebSocketClient
from clients.utils import logger
from utils.safe_stop_thread import SafeStopThread
data_queue = Queue()
class TalosWebSocketClientProcess(SafeStopThread):
def __init__(self):
SafeStopThread.__init__(self)
@staticmethod
def add_queue(data):
data_queue.put(data)
def run_once(self):
for i in range(10):
t_now = datetime.now()
self.add_queue(f"queue_{
i}_{
t_now}")
class DataUpdateProcess(SafeStopThread):
last_price_time = datetime.utcnow()
def __init__(self):
super().__init__()
def run_once(self):
data = data_queue.get()
self.process_data(data)
def process_data(self, data):
""" 处理放在队列里的数据 """
print(data)
if __name__ == '__main__':
talos_web_socket_client_process = TalosWebSocketClientProcess()
data_update_process = DataUpdateProcess()
talos_web_socket_client_process.start()
data_update_process.start()
talos_web_socket_client_process.join()
data_update_process.join()
结果图:
queue_0_2022-06-20 23:23:05.146218
queue_1_2022-06-20 23:23:05.146218
queue_2_2022-06-20 23:23:05.146218
queue_3_2022-06-20 23:23:05.146218
queue_4_2022-06-20 23:23:05.146218
queue_5_2022-06-20 23:23:05.146218
queue_6_2022-06-20 23:23:05.146218
queue_7_2022-06-20 23:23:05.146218
queue_8_2022-06-20 23:23:05.146218
queue_9_2022-06-20 23:23:05.146218
queue_0_2022-06-20 23:23:05.146218
queue_1_2022-06-20 23:23:05.146218
queue_2_2022-06-20 23:23:05.146218
queue_3_2022-06-20 23:23:05.146218
queue_4_2022-06-20 23:23:05.146218
queue_5_2022-06-20 23:23:05.146218
queue_6_2022-06-20 23:23:05.146218
queue_7_2022-06-20 23:23:05.146218
queue_8_2022-06-20 23:23:05.146218
queue_9_2022-06-20 23:23:05.146218
queue_0_2022-06-20 23:23:05.146218
queue_1_2022-06-20 23:23:05.146218
queue_2_2022-06-20 23:23:05.146218
queue_3_2022-06-20 23:23:05.146218
queue_4_2022-06-20 23:23:05.146218
queue_5_2022-06-20 23:23:05.146218
queue_6_2022-06-20 23:23:05.146218
queue_7_2022-06-20 23:23:05.146218
queue_8_2022-06-20 23:23:05.146218
queue_9_2022-06-20 23:23:05.146218
queue_0_2022-06-20 23:23:05.146218
queue_1_2022-06-20 23:23:05.146218
queue_2_2022-06-20 23:23:05.146218
queue_3_2022-06-20 23:23:05.146218
queue_4_2022-06-20 23:23:05.146218
queue_5_2022-06-20 23:23:05.146218
queue_6_2022-06-20 23:23:05.146218
queue_7_2022-06-20 23:23:05.146218
queue_8_2022-06-20 23:23:05.146218
queue_9_2022-06-20 23:23:05.146218
queue_0_2022-06-20 23:23:05.146218
queue_1_2022-06-20 23:23:05.146218
queue_2_2022-06-20 23:23:05.146218
queue_3_2022-06-20 23:23:05.146218
queue_4_2022-06-20 23:23:05.146218
queue_5_2022-06-20 23:23:05.146218
queue_6_2022-06-20 23:23:05.146218
queue_7_2022-06-20 23:23:05.146218
queue_8_2022-06-20 23:23:05.146218
queue_9_2022-06-20 23:23:05.146218
queue_0_2022-06-20 23:23:05.146218
queue_1_2022-06-20 23:23:05.146218
queue_2_2022-06-20 23:23:05.146218
queue_3_2022-06-20 23:23:05.146218
queue_4_2022-06-20 23:23:05.146218
queue_5_2022-06-20 23:23:05.146218
queue_6_2022-06-20 23:23:05.146218
queue_7_2022-06-20 23:23:05.146218
queue_8_2022-06-20 23:23:05.146218
queue_9_2022-06-20 23:23:05.146218
queue_0_2022-06-20 23:23:05.146218
queue_1_2022-06-20 23:23:05.146218
queue_2_2022-06-20 23:23:05.146218
queue_3_2022-06-20 23:23:05.146218
queue_4_2022-06-20 23:23:05.146218
queue_5_2022-06-20 23:23:05.146218
queue_6_2022-06-20 23:23:05.146218
queue_7_2022-06-20 23:23:05.146218
queue_8_2022-06-20 23:23:05.146218
queue_9_2022-06-20 23:23:05.146218
queue_0_2022-06-20 23:23:05.146218
queue_1_2022-06-20 23:23:05.146218
queue_2_2022-06-20 23:23:05.146218
queue_3_2022-06-20 23:23:05.146218
queue_4_2022-06-20 23:23:05.146218
queue_5_2022-06-20 23:23:05.146218
queue_6_2022-06-20 23:23:05.146218
queue_7_2022-06-20 23:23:05.146218
queue_8_2022-06-20 23:23:05.146218
queue_9_2022-06-20 23:23:05.146218
queue_0_2022-06-20 23:23:05.146218
queue_1_2022-06-20 23:23:05.146218
queue_2_2022-06-20 23:23:05.146218
queue_3_2022-06-20 23:23:05.146218
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.147216
queue_8_2022-06-20 23:23:05.147216
queue_9_2022-06-20 23:23:05.147216
queue_0_2022-06-20 23:23:05.147216
queue_1_2022-06-20 23:23:05.147216
queue_2_2022-06-20 23:23:05.147216
queue_3_2022-06-20 23:23:05.147216
queue_4_2022-06-20 23:23:05.147216
queue_5_2022-06-20 23:23:05.147216
queue_6_2022-06-20 23:23:05.147216
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
queue_6_2022-06-20 23:23:05.148240
queue_7_2022-06-20 23:23:05.148240
queue_8_2022-06-20 23:23:05.148240
queue_9_2022-06-20 23:23:05.148240
queue_0_2022-06-20 23:23:05.148240
queue_1_2022-06-20 23:23:05.148240
queue_2_2022-06-20 23:23:05.148240
queue_3_2022-06-20 23:23:05.148240
queue_4_2022-06-20 23:23:05.148240
queue_5_2022-06-20 23:23:05.148240
.................
边栏推荐
猜你喜欢

Drive to APasS! Use Mingdao cloud to manage F1 events

想学好C语言,操作符也很重要

StarCraft's Bug King ia retired for 2 years to engage in AI, and lamented that it was inferior

Minimum editing distance (linear DP writing method)

nifi从入门到实战(保姆级教程)——身份认证

In 2021, the global enhanced oil production surfactant revenue was about USD 202.3 million, and it is expected to reach USD 297.1 million in 2028

Private dry goods sharing: how to implement platform in Enterprise Architecture

AI for Science:科研范式、开源平台和产业形态

号称史上最难618,淘宝数据盘点你做对了吗?

How to adjust an integer that is entered in Excel but always displays decimals?
随机推荐
StarCraft's Bug King ia retired for 2 years to engage in AI, and lamented that it was inferior
千万不要错过,新媒体运营15个宝藏公众号分享
Peak store app imitation station development play mode explanation source code sharing
Interviewer: with the for loop, why do you need foreach?
Unlock the secret of C language key words (issue 6)
Histrix工作原理
R language dplyr package arrange function sorts dataframe data, sorts dataframe data through multiple data columns, specifies the first field to be sorted in descending order, and does not specify the
pull request
今晚战码先锋润和赛道第2期直播丨如何参与OpenHarmony代码贡献
Research Report on the overall scale, major manufacturers, major regions, products and application segments of hydraulic torque in the global market in 2022
The R language uses the follow up The plot function visualizes the longitudinal follow-up map of multiple ID (case) monitoring indicators, and uses stress The labels parameter adds label information t
[high frequency interview questions] difficulty 1.5/5, LCS template questions
Topic37——64. 最小路径和
master公式
AI for Science:科研范式、开源平台和产业形态
TiDB 6.0:让 TSO 更高效丨TiDB Book Rush
57. The core principle of flutter - layout process
R语言使用epiDisplay包的followup.plot函数可视化多个ID(病例)监测指标的纵向随访图、使用stress.labels参数在可视化图像中为强调线添加标签信息
面试突击60:什么情况会导致 MySQL 索引失效?
Thymeleaf的相关知识