zoukankan      html  css  js  c++  java
  • DAY 102 flask补充01

    #补充

    pipreqs:

    - 项目依赖 pip3 install pipreqs
    - 生成依赖文件:pipreqs ./
    - 安装依赖文件:pip3 install -r requirements.txt

     

    函数和方法

    from types import MethodType,FunctionType

    class Foo(object):
    def fetch(self):
    pass

    print(isinstance(Foo.fetch,MethodType)) # False
    print(isinstance(Foo.fetch,FunctionType)) # True

    obj = Foo()
    print(isinstance(obj.fetch,MethodType)) # True
    print(isinstance(obj.fetch,FunctionType)) # False

    threading.local

    多个线程修改同一个数据,复制多份变量给每个线程用,为每个线程开辟一块空间进行数据存储

    不用threading.local

    # 不用local
    from threading import Thread
    import time
    lqz = -1
    def task(arg):
       global lqz
       lqz = arg
       # time.sleep(2)
       print(lqz)

    for i in range(10):
       t = Thread(target=task,args=(i,))
       t.start()

    ###threading.local使用

    from threading import Thread
    from threading import local
    import time
    from threading import get_ident
    # 特殊的对象
    lqz = local()
    def task(arg):
       # 对象.val = 1/2/3/4/5
       lqz.value = arg
       time.sleep(2)
       print(lqz.value)
    for i in range(10):
       t = Thread(target=task,args=(i,))
       t.start()

    通过字典自定义threading.local(函数)

    from threading import get_ident,Thread
    import time
    storage = {}
    def set(k,v):
       ident = get_ident()
       if ident in storage:
           storage[ident][k] = v
       else:
           storage[ident] = {k:v}
    def get(k):
       ident = get_ident()
       return storage[ident][k]
    def task(arg):
       set('val',arg)
       v = get('val')
       print(v)

    for i in range(10):
       t = Thread(target=task,args=(i,))
       t.start()

    面向对象版

    from threading import get_ident,Thread
    import time
    class Local(object):
       storage = {}
       def set(self, k, v):
           ident = get_ident()
           if ident in Local.storage:
               Local.storage[ident][k] = v
           else:
               Local.storage[ident] = {k: v}
       def get(self, k):
           ident = get_ident()
           return Local.storage[ident][k]
    obj = Local()
    def task(arg):
       obj.set('val',arg)
       v = obj.get('val')
       print(v)
    for i in range(10):
       t = Thread(target=task,args=(i,))
       t.start()

    通过setattr和getattr实现

    from threading import get_ident,Thread
    import time
    class Local(object):
       storage = {}
       def __setattr__(self, k, v):
           ident = get_ident()
           if ident in Local.storage:
               Local.storage[ident][k] = v
           else:
               Local.storage[ident] = {k: v}
       def __getattr__(self, k):
           ident = get_ident()
           return Local.storage[ident][k]
    obj = Local()
    def task(arg):
       obj.val = arg
       print(obj.val)
    for i in range(10):
       t = Thread(target=task,args=(i,))
       t.start()

    每个对象有自己的存储空间(字典)

    from threading import get_ident,Thread
    import time
    class Local(object):
       def __init__(self):
           object.__setattr__(self,'storage',{})
       def __setattr__(self, k, v):
           ident = get_ident()
           if ident in self.storage:
               self.storage[ident][k] = v
           else:
               self.storage[ident] = {k: v}
       def __getattr__(self, k):
           ident = get_ident()
           return self.storage[ident][k]
    obj = Local()
    def task(arg):
       obj.val = arg
       obj.xxx = arg
       print(obj.val)
    for i in range(10):
       t = Thread(target=task,args=(i,))
       t.start()

    兼容线程和协程

    try:
    from greenlet import getcurrent as get_ident
    except Exception as e:
    from threading import get_ident
    from threading import Thread
    import time
    class Local(object):
    def __init__(self):
    object.__setattr__(self,'storage',{})
    def __setattr__(self, k, v):
    ident = get_ident()
    if ident in self.storage:
    self.storage[ident][k] = v
    else:
    self.storage[ident] = {k: v}
    def __getattr__(self, k):
    ident = get_ident()
    return self.storage[ident][k]
    obj = Local()
    def task(arg):
    obj.val = arg
    obj.xxx = arg
    print(obj.val)
    for i in range(10):
    t = Thread(target=task,args=(i,))
    t.start()

    partial偏函数

    #偏函数的第二个部分(可变参数),按原有函数的参数顺序进行补充,参数将作用在原函数上,最后偏函数返回一个新函数
    from functools import partial
    def test(a,b,c,d):
       return a+b+c+d

    tes=partial(test,1,2)
    print(tes(3,4))

    session源码分析

    SecureCookieSessionInterface
    -open_session
    -save_session
  • 相关阅读:
    用jquery判断当前显示器的分辨率,加载不同CSS
    [置顶] Android SDK下载和更新失败的解决方法!!!
    [置顶] 最全的Android开发开发资料
    [置顶] Android入门教程导入现有Android工程
    [置顶] 用Android访问本地站点(localhost,10.0.2.2)
    [置顶] Android入门教程Android工程目录结构介绍
    [置顶] 解决Android解析图片的OOM问题
    [置顶] Android入门教程环境搭建
    [置顶] Android 中的拿来主义(编译,反编译,AXMLPrinter2,smali,baksmali)
    Windows 8 平板电脑体验及思考
  • 原文地址:https://www.cnblogs.com/DEJAVU888/p/14894259.html
Copyright © 2011-2022 走看看