转:https://www.cnblogs.com/wangmingtao/p/9372611.html
 
30、LocalStack作为线程隔离对象的意义
  30.1 数据结构
    限制了某些能力
  30.2 线程隔离
# -*- coding=utf-8 -*-
import threading import time
from werkzeug.local import LocalStack my_stack = LocalStack()
my_stack.push(1)
print('in main thread after push, value is:' + str(my_stack.top)) def worker():
# 新线程
print('in new thread before push, value is:' + str(my_stack.top))
my_stack.push(2)
print('in new thread after push, value is:' + str(my_stack.top)) new_t = threading.Thread(target=worker, name='qiyue_thread')
new_t.start()
time.sleep(1)

test/LocalStack.py

  30.3 flask为什么需要栈结构

    需要栈结构,将两个上下文推到栈中去

  30.4 为什么需要LocalStack
    需要栈是线程隔离的
  30.5 线程隔离意义
    是当前线程能够正确引用到他自己所创建的对象,而不是引用到其他线程所创建的对象
    (1)用一个变量名(request)同事指向多个线程所创建的多个实例化对象是不可能的
    (2)可以做到,在当前线程,在引用request(变量名)可以正确找到当前线程它自己所实例化的Request对象
  30.6 请求上下文包含Request对象,所以,Request也是被线程隔离的
    session也是线程隔离
  30.7 知识梳理
    (1)线程隔离对象
      LocalStack和local是线程隔离对象
    (2)被线程隔离的对象
      通过线程隔离对象来创建被线程隔离的对象
    (3)flask的核心对象app作为一个属性存在于AppContext的应用上下文下
      核心对象app只有一个,是在入口文件创建,在主线程中被创建
    (4)多线程编程难点
      线程安全
      线程隔离
  30.8 总结
    (1)Local->LocalStack,线程隔离对象实现
      Local内部有一个字典,以线程ID号作为key
      LocalStack如何实现?LocalStack封装了Local
      操作Local,通常使用.去访问下面的属性;使用LocalStack,需要使用那几个常用的方法和属性,push、pop、top
    (2)AppContext->RequestContext
      请求进来,会被推入到LocalStack的栈中去,同时在请求结束时,AppContext和RequestContext会被pop弹出去
    (3)Flask->AppContext Request->RequestContext
      AppContext重要特点,将Flask核心对象作为它的一个属性,保存了起来
      RequestContext请求上下文,将请求对象Request封装和保存
    (4)current_app->(LocalStack.top=Appcontext top.app=Flask)
      current_app指向的是LocalStack下面的栈顶元素的一个属性,也就是top.app,Flask的核心对象
      栈顶元素为应用上下文
    (5)request->(LocalStack.top=RequestContext top.request=Request)
      request实际指向的是LocalStack栈顶元素下面的Request请求对象

flask高级编程 LocalStack 线程隔离的更多相关文章

  1. Flask 上下文机制和线程隔离

    1. 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决, 上下文机制就是这句话的体现. 2. 如果一次封装解决不了问题,那就再来一次 上下文:相当于一个容器,保存了Flask程序运行过程中 ...

  2. Python Flask高级编程

    第1章 课程导语介绍课程的内容1-1 开宗明义 试看1-2 课程维护与提问 第2章 Flask的基本原理与核心知识本章我们首先介绍Python官方推荐的最佳包与虚拟环境管理工具:Pipenv.接着我们 ...

  3. flask 高级编程 上下文与栈(转)

    转: https://www.cnblogs.com/wangmingtao/p/9372611.html 22.上下文与出入栈 22.1 请求过程 请求过来,flask会实例化一个Request C ...

  4. 【UNIX环境高级编程】线程同步

    当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图.如果每个线程使用的变量都是其他线程不会读取和修改的,那么就不存在一致性问题.同样,如果变量是只读的也不会有一致性问题.但是,当一个线程可 ...

  5. 六十七:flask上下文之Local线程隔离对象

    Local对象在flask中,类似于request对象,其实是绑定到了werkzeug.local.Local对象上,这样即使是同一个对象,在多线程中都是隔离的,类似的对象还有session以及g对象 ...

  6. 学习python-20191208(1)-Python Flask高级编程开发鱼书_第03章_数据与flask路由

    视频01: 略...... ———————————————————————————————————————————————————————————— 视频02: 搜索需要外部数据源,也就是需要外部的A ...

  7. Linux高级编程--09.线程互斥与同步

    多个线程同时访问共享数据时可能会冲突,比如两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成: 从内存读变量值到寄存器 寄存器的值加1 将寄存器的值写回内存 假设两个线程在多处理器平台 ...

  8. Linux高级编程--08.线程概述

    线程 有的时候,我们需要在一个基础中同时运行多个控制流程.例如:一个图形界面的下载软件,在处理下载任务的同时,还必须响应界面的对任务的停止,删除等控制操作.这个时候就需要用到线程来实现并发操作. 和信 ...

  9. Unix环境高级编程(十一)线程

    一个进程在同一时刻只能做一件事情,线程可以把程序设计成在同一时刻能够做多件事情,每个线程处理各自独立的任务.线程包括了表示进程内执行环境必需的信息,包括进程中标识线程的线程ID.一组寄存器值.栈.调度 ...

随机推荐

  1. PHP提取字符串中的图片地址

    PHP提取字符串中的图片地址 $str='<p><img border="0" src="upfiles/2009/07/1246430143_1.jp ...

  2. Linux命令扫盲 之 sar

    今天在读<大规模Web服务开发技术>一书的时候,书中提到了sar这个命令,感觉很有用,有必要整理学习一下.(对于一位Linux初学者,不能放过任何一个学习机会 :P) 打开自己的CentO ...

  3. 图像滤镜艺术---(Instagram)1977滤镜

    原文:图像滤镜艺术---(Instagram)1977滤镜 图像特效---(Instagram)1977滤镜 本文介绍1977这个滤镜的具体实现,这个滤镜最早是Instagram中使用的 ,由于Ins ...

  4. SqlServer 禁止架构更改的复制中手动修复使发布和订阅中分别增加的字段同步

    原文:SqlServer 禁止架构更改的复制中手动修复使发布和订阅中分别增加的字段同步 由于之前的需要,禁止了复制架构更改,以至在发布中添加一个字段,并不会同步到订阅中,而现在又在订阅中添加了一个同名 ...

  5. cmake常用工程示例大集合

    1 简单的可执行文件生成工程 1.1 源文件   main.cpp #include <stdio.h> int main(int argc, char *argv[]) { printf ...

  6. <iOS 导航栏>第一节:导航栏透明方法实现代码

      说下导航栏的透明方法:   很多应用需要导航栏随着向上滑动,逐渐从透明变成不透明,很炫酷,大部分应用都在使用导航栏渐变效果,现附上代码然后直接将实现,一会讲下如何来实现,这一部分直接上代码.   ...

  7. Using VNC on a debian/Ubuntu server with a OS X Mac

    I got a brand new MacBook Pro 13" 2016. I used to work on GNU/Linux for decades. I don't want t ...

  8. python的实用函数

    >>> file=open('txt.txt','a') >>> print >> file,'hello,world' >>> fi ...

  9. 30443数据查询语言DQL

    5.4 SQL的数据查询功能 数据查询是数据库最常用的功能.在关系数据库中,查询操作是由SELECT语句来完成.其语法格式如下: SELECT column_expression FROM table ...

  10. List集合总结,对比分析ArrayList,Vector,LinkedList

    前面已经写了三篇关于Java集合的文章,包括: Java集合 ArrayList原理及使用 再说Java集合,subList之于ArrayList Java集合 LinkedList的原理及使用 关于 ...