zoukankan      html  css  js  c++  java
  • 析构函数 实例析构 类析构

    #!python
    # -*- coding:utf-8 -*-
    # 场景:
    # 目的:通过单例实现客户端调用sdk时,sdk中的方法对客户端数据的批处理

    # 参考:
    # {
    # Python单例模式(Singleton)的N种实现 - 知乎
    # https://zhuanlan.zhihu.com/p/37534850

    # 设计模式(Python)-单例模式 - 简书
    # https://www.jianshu.com/p/ec6589e02e2f

    # http://xiaorui.cc/2016/04/10/python多线程下保持单例模式的实例唯一/

    # PythonDecoratorLibrary - Python Wiki
    # https://wiki.python.org/moin/PythonDecoratorLibrary

    # 3. Data model — Python 3.7.3 documentation
    # https://docs.python.org/3/reference/datamodel.html#object.__new__

    # 8.10. Queue — A synchronized queue class — Python 2.7.16 documentation
    # https://docs.python.org/2/library/queue.html
    # The Queue class in this module implements all the required locking semantics.

    # 3. Data model — Python 3.7.3 documentation
    # https://docs.python.org/3/reference/datamodel.html#specialnames

    # 3. Data model — Python 3.7.3 documentation
    # https://docs.python.org/3/reference/datamodel.html#object.__del__

    # }
    # 注意:
    # 线程安全
    # 实例析构、类的析构

    # 需要测试:
    # 1、线程安全
    # 2、效率

    # TODO 类的析构

    import threading


    def make_synchronized(func):
    func.__lock__ = threading.Lock()

    def synced_func(*args, **kws):
    with func.__lock__:
    return func(*args, **kws)

    return synced_func


    class SdkSingletonBatchHandler(object):
    __instance = None
    # 存放批处理的队列 批处理方法对其按照先进先出FIFO处理
    queueContainer = []
    queueLength = None
    batchHandlerFunc = None
    # 队列生存时间
    timeToLiveSeconds = 0.5
    __bornTime = 0

    @make_synchronized
    def __new__(cls, *args, **kwargs):
    if cls.__instance is None:
    cls.__bornTime = time.time()
    cls.__instance = object.__new__(cls, *args, **kwargs)
    if cls.queueLength is None:
    cls.queueLength = 10
    cls.batchAction()
    return cls.__instance

    @classmethod
    def batchHandler(cls, queueContainer):
    return cls.batchHandlerFunc

    @classmethod
    def batchAction(cls):
    if len(cls.queueContainer) >= cls.queueLength or cls.timeToLiveSeconds < time.time() - cls.__bornTime:
    cls.batchHandler(cls.queueContainer)
    cls.queueContainer = []
    cls.__bornTime = time.time()

    @classmethod
    def diyClassDestruct(cls):
    # Python 2.7.5 自定义类的析构函数,注意不是实例的析构函数
    if len(cls.queueContainer) > 0:
    cls.batchHandler(cls.queueContainer)

    def __del__(self):
    # Python 2.7.5 实例的析构函数
    # 实际测试发现无效
    if len(self.queueContainer) > 0:
    self.batchHandler(self.queueContainer)


    import time


    def bizFuncNotBatch(param):
    time.sleep(0.02)
    print "do sth" + str(param)


    def bizFuncBatch(param):
    def batchHandler(paramList):
    for i in paramList:
    pass
    time.sleep(0.02)
    print "do sth" + str(paramList)

    s = SdkSingletonBatchHandler()
    s.__class__.queueLength = 200
    s.__class__.timeToLiveSeconds = 123
    s.__class__.batchHandlerFunc = batchHandler
    s.__class__.queueContainer.append(param)
    s.__class__.batchAction()
    print "do sth Batch"
    # return 测试所需对象id
    return s


    # 测试
    # 线程安全

    def testThreadSafeWorker():
    s1 = bizFuncBatch("param")
    s2 = bizFuncBatch("param")
    print "id1={},id2={}".format(id(s1), id(s2))


    task = []
    for i in range(300):
    t = threading.Thread(target=testThreadSafeWorker())
    task.append(t)
    for i in task:
    i.start()
    for i in task:
    i.join()

    # 测试
    # 效率

    data = [{'i': i, 'v': "value"} for i in range(20)]

    consoleInfo = []


    def consoleInfoHub(*args):
    global consoleInfo
    s = ("{}" + time.ctime() + " " + str(time.time())).format(args[0])
    consoleInfo.append(s)


    consoleInfoHub("notBatch:Start:")
    for i in data:
    bizFuncNotBatch(i)
    consoleInfoHub("notBatch:End:")
    consoleInfoHub("Batch:Start:")
    for i in data:
    bizFuncBatch(i)
    consoleInfoHub("Batch:End:")
    for i in consoleInfo:
    print i
    class TestClassDel(object):
    __instance = None

    def __init__(self):
    print("init")

    def __new__(cls, *args, **kwargs):
    if cls.__instance is None:
    cls.__instance = object.__new__(cls, *args, **kwargs)
    return cls.__instance

    def __del__(self):
    print(1)

    s1 = TestClassDel()
    s2 = TestClassDel()
    del s1
    del s2


    init
    init
    1

    Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32

    class TestClassDel(object):
    __instance = None

    def __init__(self):
    print "init"

    def __new__(cls, *args, **kwargs):
    if cls.__instance is None:
    cls.__instance = object.__new__(cls, *args, **kwargs)
    return cls.__instance

    def __del__(self):
    print 1

    s1 = TestClassDel()
    s2 = TestClassDel()
    del s1
    del s2


    Python 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)] on win32

    init
    init

     没有打印1

     注意以上为单例模式 

    class TestClassDel(object):
    __instance = None

    def __init__(self):
    print "init"

    def __new__(cls, *args, **kwargs):
    if cls.__instance is None:
    cls.__instance = object.__new__(cls, *args, **kwargs)
    return cls.__instance

    def __del__(self):
    print 1

    s1 = TestClassDel()
    s2 = TestClassDel()
    del s1
    del s2

    class T():
    def __call__(self, *args, **kwargs):
    print 1
    d=T().__call__()


    打印1

    受此启发

    【注意 目标环境为python2.7.5】


  • 相关阅读:
    函数重载及缺省参数
    巨大的斐波那契数!
    求任意多边形的面积
    hdu1068 Girls and Boys 匈牙利算法(邻接表)
    C. Coconut(2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛)
    A. Banana (2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛)
    hdu6195 cable cable cable(from 2017 ACM/ICPC Asia Regional Shenyang Online)
    hdu6201 transaction transaction transaction(from 2017 ACM/ICPC Asia Regional Shenyang Online)
    hdu3938 Portal 离线+并查集
    同构图
  • 原文地址:https://www.cnblogs.com/rsapaper/p/11004727.html
Copyright © 2011-2022 走看看