使用场景概括
- 处理需要等待的任务可以配合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()
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()
def stopped(self):
return self.stop_event.is_set()
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
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 (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:
addend = -3600
else:
addend = 3600
new_rollover_at += addend
self.rolloverAt = new_rollover_at
def rotate(self, source, dest):
if not callable(self.rotator):
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 ')
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 = 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')
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')
self.host = "ws.xxxx.com"
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
.................
|