一 . 偏函数

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. okhttputils【 Android 一个改善的okHttp封装库】使用(一)

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本文使用的OKHttp封装库是张鸿洋(鸿神)写的,因为在项目中一直使用这个库,所以对于一些常用的请求方式都验证过,所以特此整理下. ...

  2. Redis学习笔记~分布锁的使用

    回到目录 分布锁主要用在多进程共同访问同一个资源时候,用来保持同一时间段只能有一个进程执行,同时避免了并发冲突的出现,这在很多场景都会用到,像秒杀库存,抽奖库存,多操作者处理一家公司等. void T ...

  3. Linux framebuffer deferred io机制

    一.总体框架 deferred io机制主要用于驱动没有实现自刷新同时应用层又不想调用FBIOPAN_DISPLAY的一个折中方案,  使用ioctrl FBIOPAN_DISPLAY好处是节能, 驱 ...

  4. View的绘制流程

    这是年假最后一篇笔记了,本篇文章的内容主要来自<android开发艺术探索>,在文章的最后有这本书的网上版本. 项目源码 目录 MeasureSpec SpecMode分类 UNSPECI ...

  5. MVC开发模式简述

    了解MVC开发模式,首先我们要了解一下发展趋势 一.什么是软件设计 Jack W.Reeves 于14年前(1992年),就在其撰写的论文——<What is Software Design&g ...

  6. c#如何声明数据结构类型为null?

    可以通过如下两种方式声明可为空的类型:System.Nullable<T> variable;T?variable:eg:int值是-2,147,483,648 到 2,147,483,6 ...

  7. java爬虫系列第三讲-获取页面中绝对路径的各种方法

    在使用webmgiac的过程中,很多时候我们需要抓取连接的绝对路径,总结了几种方法,示例代码放在最后. 以和讯网的一个页面为例: xpath方式获取 log.info("{}", ...

  8. Dynamics 365-CRM又报看不懂的错误了

    在CRM上执行各种操作,时不时会碰到各种问题,尤其是CRM环境里包含越来越多定制的时候.有的问题在CRM弹出的错误提示框,一目了然:而有的,可能就是简单的提示:SQL Error. 这个时候我们可能都 ...

  9. Snapde和常用的CSV文件编辑器对比

    Snapde,一个专门为编辑超大型数据量CSV文件而设计的单机版电子表格软件:它运行的速度非常快,反应非常灵敏. CSV是一种用逗号分隔列.回车分割行的文本文件,市面上常用的CSV编辑软件有:Snap ...

  10. 关于 python中的 TKinterlistbox 控件加横竖滚动条

    上代码 win=tkinter.Tk() scorllbar=tkinter.Scrollbar(win) scorllbar.pack(side=tkinter.RIGHT,fill=tkinter ...