当前位置:网站首页>自定义多线程基类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
.................
边栏推荐
- Deep understanding of happens before principle
- R语言使用epiDisplay包的poisgof函数对泊松回归(Poisson Regression)执行拟合优度检验、检验是否存在过度离散问题(overdispersion)
- [high frequency interview questions] difficulty 1.5/5, LCS template questions
- nifi从入门到实战(保姆级教程)——身份认证
- Getting started with go web programming: validators
- 微服务拆分
- Don't miss it. New media operates 15 treasure official account to share
- 聊聊 Go 语言与云原生技术
- i. Construction of mx6ull C language environment
- The GLM function of R language is used to build a binary logistic regression model (the family parameter is binomial), and the AIC function is used to compare the AIC values of the two models (simple
猜你喜欢
Research Report on the overall scale, major manufacturers, major regions, products and application segments of hydraulic torque in the global market in 2022
行业洞察 | 新零售业态下,品牌电商应如何重塑增长?
剑指 Offer 04. 二维数组中的查找
面试突击60:什么情况会导致 MySQL 索引失效?
ACL 2022 | 中科院提出TAMT:TAMT:通过下游任务无关掩码训练搜索可迁移的BERT子网络
Jwas: a Bayesian based GWAS and GS software developed by Julia
想学好C语言,操作符也很重要
$15.8 billion! 2021 the world's top15 most profitable hedge fund giant
优博讯出席OpenHarmony技术日,全新打造下一代安全支付终端
动态规划【四】(计数类dp)例题:整数划分
随机推荐
MIT6.031 软件构造 Reading7阅读笔记Designing Specifications(设计规范)
【面试高频题】难度 1.5/5,LCS 模板题
Neo4j:入门基础(一)之安装与使用
建木持续集成平台v2.5.0发布
threejs的环境光+点光源+平行光源+球面光 以及hepler理解+阴影()
MapReduce principle analysis (in-depth source code)
MySQL learning 1: installing MySQL
c/s 架构
Operators are also important if you want to learn the C language well
Master formula
namespace ‘rlang’ 0.2.0 is being loaded, but &gt;= 0.3.0 is required
微服务拆分
数学知识——博弈论(巴什博奕、尼姆博奕、威佐夫博奕)思路及例题
在 Golang 中构建 CRUD 应用程序
Write it down once Net analysis of a property management background service stuck
树莓派 3b+ 学习
On ticheck
Take stock of some easy-to-use and niche markdown editors
Shell script learning notes
浅谈珂朵莉树