一 . 偏函数

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

Flask--偏函数, 线程安全, 请求上下文的更多相关文章

  1. 【Flask源码分析——请求上下文与应用上下文】

    Flask中有两种上下文,请求上下文和应用上下文.两者的作用域都处于一个请求的局部中. 查看源代码,上下文类在flask.ctx模块中定义 AppContext类定义应用上下文,app是当前应用Web ...

  2. flask请求上下文

    先看一个例子: #!/usr/bin/env python # -*- coding:utf-8 -*- import threading # local_values = threading.loc ...

  3. python 全栈开发,Day139(websocket原理,flask之请求上下文)

    昨日内容回顾 flask和django对比 flask和django本质是一样的,都是web框架. 但是django自带了一些组件,flask虽然自带的组件比较少,但是它有很多的第三方插件. 那么在什 ...

  4. flask 请求上下文

    一篇引用大牛的 https://www.cnblogs.com/zhaopanpan/p/9457343.html ### 线程安全 ```python# 线程不安全class Foo(object) ...

  5. Flask(4)- flask请求上下文源码解读、http聊天室单聊/群聊(基于gevent-websocket)

    一.flask请求上下文源码解读 通过上篇源码分析,我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__call__方法返回了app的wsgi_app(en ...

  6. flask的请求上下文源码解读

    一.flask请求上下文源码解读 通过上篇源码分析( ---Flask中的CBV和上下文管理--- ),我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__ ...

  7. flask 请求上下文源码(转)

    本篇阅读目录 一.flask请求上下文源码解读 二.http聊天室(单聊/群聊)- 基于gevent-websocket 回到顶部 转:https://www.cnblogs.com/li-li/p/ ...

  8. flask上下文全局变量,程序上下文、请求上下文、上下文钩子

    Flask上下文 Flask中有两种上下文,程序上下文(application context)和请求上下文(request context) 当客户端发来请求时,请求上下文就登场了.请求上下文里包含 ...

  9. Flask系列10-- Flask请求上下文源码分析

    总览 一.基础准备. 1. local类 对于一个类,实例化得到它的对象后,如果开启多个线程对它的属性进行操作,会发现数据时不安全的 import time from threading import ...

随机推荐

  1. 补习系列(13)-springboot redis 与发布订阅

    目录 一.订阅发布 常见应用 二.Redis 与订阅发布 三.SpringBoot 与订阅发布 A. 消息模型 B. 序列化 C. 发布消息 D. 接收消息 小结 一.订阅发布 订阅发布是一种常见的设 ...

  2. 关于px,分辨率,ppi的辨析

    概述  在本篇文章的开始,我先为大家解释一下这三个名词的概念.  px全称为pixel--像素.pc及移动设备的屏幕就是通过往像素矩阵中填充颜色,从而在宏观上体现出图像.像素越小,图像越清晰.  分辨 ...

  3. 前端知识复习:Html DIV 图文混排(文字放在图片下边)

    Html知识复习之图文混排 练习练习基础 先上效果图: 废话不多说,直接贴代码: <!DOCTYPE html> <html xmlns="http://www.w3.or ...

  4. 你必须知道的.net读书笔记之第二回深入浅出关键字---对抽象编程:接口和抽象类

    请记住,面向对象思想的一个最重要的原则就是:面向接口编程. 借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程. 抽象类应主要用于关系密切的对象,而接口 ...

  5. mysql-16进制、十进制互转

    先截取左边4位,再转换: conv(left(t1.DEVICEID, 4), 16, 10)      //转十进制 conv(left(t1.DEVICEID, 4), 10, 16)      ...

  6. Springboot2注解使用Mybatis动态SQL

    1.简单SQL使用 //从***数据表获取统计数据 @Select("select count(*) from issues where issue_type = #{type}" ...

  7. [C#学习笔记3]关于Main(string[ ] args)中args命令行参数

    Main(string[] args)方法是C#程序的入口,程序从这里开始执行,在这里结束.C#代码逻辑要包含在一个类型(Type)中,游离的.全局的变量或函数是不存在的,这里的类型包括类(class ...

  8. 基于windows环境的Flask网站搭建(mysql + conda + redis)

    1下载mysql-installer-community-5.7.24.0.msi (https://dev.mysql.com/downloads/windows/installer/8.0.htm ...

  9. 新浪短连接API免登陆免认证实例

    string source = "source=2849184197"; // APP Key,这个可以根据自己需要去网上搜索 string url_long = $"u ...

  10. 服务器部署Apache+PHP+MYSQL+Laravel

    1.安装PHP 添加php安装源: sudo apt-get install python-software-properties sudo add-apt-repository ppa:ondrej ...