Flask的线程,携程与并发 (2)
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)) |
| print(isinstance(Foo.fetch,FunctionType)) |
| |
| obj = Foo() |
| print(isinstance(obj.fetch,MethodType)) |
| print(isinstance(obj.fetch,FunctionType)) |
threading.local
多个线程修改同一个数据,复制多份变量给每个线程用,为每个线程开辟一块空间进行数据存储
不用threading.local
| |
| from threading import Thread |
| import time |
| lqz = -1 |
| def task(arg): |
| global lqz |
| lqz = arg |
| |
| 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): |
| |
| 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 |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2022-08-01 选课系统前戏