IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 自定义多线程基类threading.Event -> 正文阅读

[Python知识库]自定义多线程基类threading.Event

使用场景概括

  1. 处理需要等待的任务可以配合asyncio.run完成异步任务。
  2. 处理多继承任务,且需要循环实例化类的操作

项目实例

一个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
.................
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-06-25 18:04:45  更:2022-06-25 18:05:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 3:48:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计