Flask--偏函数, 线程安全, 请求上下文
一 . 偏函数
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--偏函数, 线程安全, 请求上下文的更多相关文章
- 【Flask源码分析——请求上下文与应用上下文】
Flask中有两种上下文,请求上下文和应用上下文.两者的作用域都处于一个请求的局部中. 查看源代码,上下文类在flask.ctx模块中定义 AppContext类定义应用上下文,app是当前应用Web ...
- flask请求上下文
先看一个例子: #!/usr/bin/env python # -*- coding:utf-8 -*- import threading # local_values = threading.loc ...
- python 全栈开发,Day139(websocket原理,flask之请求上下文)
昨日内容回顾 flask和django对比 flask和django本质是一样的,都是web框架. 但是django自带了一些组件,flask虽然自带的组件比较少,但是它有很多的第三方插件. 那么在什 ...
- flask 请求上下文
一篇引用大牛的 https://www.cnblogs.com/zhaopanpan/p/9457343.html ### 线程安全 ```python# 线程不安全class Foo(object) ...
- Flask(4)- flask请求上下文源码解读、http聊天室单聊/群聊(基于gevent-websocket)
一.flask请求上下文源码解读 通过上篇源码分析,我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__call__方法返回了app的wsgi_app(en ...
- flask的请求上下文源码解读
一.flask请求上下文源码解读 通过上篇源码分析( ---Flask中的CBV和上下文管理--- ),我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__ ...
- flask 请求上下文源码(转)
本篇阅读目录 一.flask请求上下文源码解读 二.http聊天室(单聊/群聊)- 基于gevent-websocket 回到顶部 转:https://www.cnblogs.com/li-li/p/ ...
- flask上下文全局变量,程序上下文、请求上下文、上下文钩子
Flask上下文 Flask中有两种上下文,程序上下文(application context)和请求上下文(request context) 当客户端发来请求时,请求上下文就登场了.请求上下文里包含 ...
- Flask系列10-- Flask请求上下文源码分析
总览 一.基础准备. 1. local类 对于一个类,实例化得到它的对象后,如果开启多个线程对它的属性进行操作,会发现数据时不安全的 import time from threading import ...
随机推荐
- 补习系列(13)-springboot redis 与发布订阅
目录 一.订阅发布 常见应用 二.Redis 与订阅发布 三.SpringBoot 与订阅发布 A. 消息模型 B. 序列化 C. 发布消息 D. 接收消息 小结 一.订阅发布 订阅发布是一种常见的设 ...
- 关于px,分辨率,ppi的辨析
概述 在本篇文章的开始,我先为大家解释一下这三个名词的概念. px全称为pixel--像素.pc及移动设备的屏幕就是通过往像素矩阵中填充颜色,从而在宏观上体现出图像.像素越小,图像越清晰. 分辨 ...
- 前端知识复习:Html DIV 图文混排(文字放在图片下边)
Html知识复习之图文混排 练习练习基础 先上效果图: 废话不多说,直接贴代码: <!DOCTYPE html> <html xmlns="http://www.w3.or ...
- 你必须知道的.net读书笔记之第二回深入浅出关键字---对抽象编程:接口和抽象类
请记住,面向对象思想的一个最重要的原则就是:面向接口编程. 借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程. 抽象类应主要用于关系密切的对象,而接口 ...
- mysql-16进制、十进制互转
先截取左边4位,再转换: conv(left(t1.DEVICEID, 4), 16, 10) //转十进制 conv(left(t1.DEVICEID, 4), 10, 16) ...
- Springboot2注解使用Mybatis动态SQL
1.简单SQL使用 //从***数据表获取统计数据 @Select("select count(*) from issues where issue_type = #{type}" ...
- [C#学习笔记3]关于Main(string[ ] args)中args命令行参数
Main(string[] args)方法是C#程序的入口,程序从这里开始执行,在这里结束.C#代码逻辑要包含在一个类型(Type)中,游离的.全局的变量或函数是不存在的,这里的类型包括类(class ...
- 基于windows环境的Flask网站搭建(mysql + conda + redis)
1下载mysql-installer-community-5.7.24.0.msi (https://dev.mysql.com/downloads/windows/installer/8.0.htm ...
- 新浪短连接API免登陆免认证实例
string source = "source=2849184197"; // APP Key,这个可以根据自己需要去网上搜索 string url_long = $"u ...
- 服务器部署Apache+PHP+MYSQL+Laravel
1.安装PHP 添加php安装源: sudo apt-get install python-software-properties sudo add-apt-repository ppa:ondrej ...