一 . 偏函数

from functools import partial

def func(a, b):
return a + b new_func = partial(func, 3, 4) # 3,4就是a,b, 也可传*args **kwargs
ret = new_func() # 也可以这样写,结果是一样的
# new_func = partial(func, 3) # 这个3是a
# ret = new_func(4) # 这个4是b
print(ret) #

二 . 线程安全

# 当使用公共变量的时候,开启多线程,数据是不安全的, 可能会被修改,
如果数据是安全的,那么下面代码打印的应该0-9不重复且无序
import time
import threading
from threading import Thread class Foo(object):
pass foo = Foo() def func(i):
foo.num = i
time.sleep(1)
print(foo.num, threading.current_thread().ident, foo)
for i in range(10):
task = Thread(target=func, args=(i,))
task.start()

  

  解决办法

# 我们既想使用多线程,又想让数据安全,也就是不共享,这里需要用到 local
import time
from threading import Thread, local
import threading class Foo(local):
pass foo = Foo() def func(i):
foo.num = i
time.sleep(1)
print(foo.num, threading.current_thread().ident, foo) for i in range(10):
task = Thread(target=func, args=(i,))
task.start()

  

这里local帮助我们节省了时间,却消耗了空间, 但是这点空间相对于线程执行效率来说不知一提

三 . 请求上下文

  既然谈到了请求上下文,那么我们需要知道一下什么是上下文,说白了就是请求从发起到完成所需要的环境

  

Flask中的request不同于Django,它是导入进来的,这个是,也就是说它是全局变量, 为了避免多线程来应用它而导致它产生改变,flask采用了local这个特殊的对象,
  这个local对象可以对线程进行隔离,也就是说有了这个local,每个线程对local对象进行修改都不影响其他线程,在请求后,LocalStack栈中会销毁请求上下文对象.
实现这种原理就是用线程的ID作为key来保存,每个线程都会找到自己的ID.
但是flask用的不是threading.local,而不是werkzeuk的local,因为:
  1.werkzeuk自定义的__storage__保存不同线程的状态
  2.werkzeuk通过get_ident函数来获取线程标识符(区分用的ID)
  3.python3.5以上开始对协程支持,如果用threading.local,可能造成变量在接收时相互干扰,因为一个线程中有多个协程去请求
  4.除了local外,werkzeuk还实现了两种数据结构,LocalStack,LocalProxy

  现在来看一下请求上下文的过程

服务器框架在接收http请求的时候,去调用app, app在执行run方法的时候,下面执行了werkzeuk模块中的run_simple,
werkzeuk触发了flask的__call__方法,__call__方法返回的是wsgi_app,直接执行wsgi_app.
# 详细过程见链接:
https://www.processon.com/view/link/5cb1d4c6e4b069ac5a259818

最新文章

  1. Visual Studio Code 代理设置
  2. opts=opts | |{}
  3. 限制action所接受的请求方式或请求参数
  4. SQLite 事务
  5. C++的默认构造函数与构造函数
  6. 托管到github上的网页图片在百度浏览器中显示不全
  7. git命令使用
  8. memcache的内存回收机制
  9. wampserver2.5 apache2.4.9:forbidden,本机可以访问,局域网内部能访问。
  10. 使用C语言在Win控制台中输出带颜色的文字
  11. 《asp.net mvc3 高级编程》第一章
  12. [置顶] css3 befor after 简单使用 制作时尚焦点图相框
  13. Java图形化界面设计——容器(JFrame)
  14. js跨域访问,No ‘Access-Control-Allow-Origin‘ header is present on
  15. 再回首UML之下篇
  16. Docker镜像仓库清理的探索之路
  17. Excel 使用单元格的值 查询MySQL数据库并返回数据给相应的单元格
  18. 【redis 学习系列】API的理解与使用(二)
  19. Node学习笔记(三)
  20. a标签中可以加button,但是不提倡;button中不能加a标签,否则不能跳转

热门文章

  1. DrawerLayoutDemo【侧边栏(侧滑菜单)简单实现】
  2. [macOS开发.NET Core] 一个简单的WEB程序
  3. 避免Linux上错删文件
  4. webpack初探 - (一)
  5. Docker进阶之二:Docker内部组件
  6. 浅析关于java的一些基础问题(上篇)
  7. 零基础学Python--------第9章 异常处理及程序调试
  8. react中PureComponent浅对比策略
  9. php封装生成随机数函数
  10. 四款让你绝对上瘾的手机APP 用一次就会爱不释手