单例 对类变量的修改 批修改

#!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处理    queue_ = []    queueLength = None    batchHandlerFunc = None    # 队列生存时间    timeToLiveSeconds = 1    __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        if len(cls.queue_) >= cls.queueLength or cls.timeToLiveSeconds < time.time() - cls.__bornTime:            cls.batchHandler(cls.queue_)            cls.queue_ = []            cls.bornTime = time.time()        return cls.__instance

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

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 = 100    s.__class__.batchHandlerFunc = batchHandler    s.queue_.append(param)    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(1000)]consoleInfo = []consoleInfo.append("notBatch:Start:" + time.ctime())for i in data:    bizFuncNotBatch(i)consoleInfo.append("notBatch:End:" + time.ctime())consoleInfo.append("Batch:Start:" + time.ctime())for i in data:    bizFuncBatch(i)consoleInfo.append("Batch:End:" + time.ctime())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 s1del 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 s1del s2

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

init
init

没有打印1



原文地址:https://www.cnblogs.com/yuanjiangw/p/11004727.html

时间: 2024-11-05 22:53:28

单例 对类变量的修改 批修改的相关文章

JS单例设计模式

 单例,指的是只有一个实例的对象.    在应用单例模式时,生成单例的类必须保证只有一个实例的存在,很多时候整个系统只需要拥有一个全局对象,才有利于协调系统整体的行为.比如在整个系统的配置文件中,配置数据有一个单例对象进行统一读取和修改,其他对象需要配置数据的时候也统一通过该单例对象来获取配置数据,这样就可以简化复杂环境下的配置管理.    实现一:对象字面量 1 var singleton = { 2 name : value, 3 method : function(){ 4 //这里是方法

Python单例的一种简单写法

最原始的想法就是每个类都重写new方法. class Dog: dog = None def __new__(cls, *args, **kwargs): if cls.dog is None: cls.dog = object.__new__(cls) print('create singleton over') return cls.dog def __init__(self, name): print('init is called') self.name = name # 下面这句话会报

[转]Servlet 单例多线程

Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例): 2.容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servlet.xml的<Connector>设置线程池中线程数目,初始化线程池通过web.xml,初始化每个参数值等等. 3.当请求到达时,Servlet容器通过调度线程(Dispatcha

Servlet单例多线程

Servlet如何处理多个请求访问?Servlet容器默认是采用单实例多线程的方式处理多个请求的:1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例):2.容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servlet.xml的<Connector>设置线程池中线程数目,初始化线程池通过web.xml,初始化每个参数值等等.3.当请求到达时,Servlet容器通过调度线程(Dispatchaer T

spring mvc 的Controller类是单例?

使用Spring MVC有一段时间了,之前一直使用Struts2,在struts2中action都是原型(prototype)的, 说是因为线程安全问题,对于Spring MVC中bean默认都是(singleton)单例的,那么用@Controller注解标签注入的Controller类是单例实现的? 测试结果发现spring3中的controller默认是单例的,若是某个controller中有一个私有的变量i,所有请求到同一个controller时,使用的i变量是共用的,即若是某个请求中修

Servlet 单例多线程

转自:http://www.cnblogs.com/yjhrem/articles/3160864.html Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例): 2.容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servlet.xml的 设置线程池中线程数目,初始化线程池通过web.xml,初始

Servlet 单例多线程【转】

源地址:Servlet 单例多线程 Servlet如何处理多个请求访问?Servlet容器默认是采用单实例多线程的方式处理多个请求的:1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例):2.容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servlet.xml的<Connector>设置线程池中线程数目,初始化线程池通过web.xml,初始化每个参数值等等.3.当请求到达时,Servlet容器通过

Java学习资料-Servlet单例多线程

Servlet 单例多线程 Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例): 2.容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servlet.xml的<Connector>设置线程池中线程数目,初始化线程池通过web.xml,初始化每个参数值等等. 3.当请求到达时,Servlet容器通过

线程安全的分析--final、static、单例、线程安全

我的代码中已经多次使用了线程,然后还非常喜欢使用据说是线程不安全的静态方法,然后又看到很多地方最容易提的问题就是这个东西线程不安全 于是我不免产生了以下几个亟待解决的问题: 什么样的代码是天生线程安全的?而不用加锁 线程是否安全的本质是什么? 什么是快速把一段代码变成线程安全的通用方法 final static 单例 线程安全 之间的关系 1.首先我们知道,如果线程只是执行自己内部的代码(其实也是使用一些对象的方法,但是是局部变量,那么就线程安全),那一定是线程安全的 这句话严格一些说可以是这样