转:https://www.cnblogs.com/wangmingtao/p/9372611.html
 
30、LocalStack作为线程隔离对象的意义
  30.1 数据结构
    限制了某些能力
  30.2 线程隔离
  1. # -*- coding=utf-8 -*-
  2. import threading
  3.  
  4. import time
  5. from werkzeug.local import LocalStack
  6.  
  7. my_stack = LocalStack()
  8. my_stack.push(1)
  9. print('in main thread after push, value is:' + str(my_stack.top))
  10.  
  11. def worker():
  12. # 新线程
  13. print('in new thread before push, value is:' + str(my_stack.top))
  14. my_stack.push(2)
  15. print('in new thread after push, value is:' + str(my_stack.top))
  16.  
  17. new_t = threading.Thread(target=worker, name='qiyue_thread')
  18. new_t.start()
  19. 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. C# IDisposable接口的使用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. Bootstrap 分页翻页

    @{    Layout = null;}<!DOCTYPE html><html><head>    <meta name="viewport&q ...

  3. C# API 获取系统DPI缩放倍数跟分辨率大小

    原文:C# API 获取系统DPI缩放倍数跟分辨率大小 using System; using System.Drawing; using System.Runtime.InteropServices ...

  4. CSS,让100%的宽度,自动减10,让100%的高度,自动减10,可以加减乘除

    CSS,让100%的宽度,自动减10,让100%的高度,自动减10,可以加减乘除 实例: .add{ width: calc(100% - 10px); height: calc(100% - 10p ...

  5. C# 多进程安全

    多个应用程序同时写入数据到一个文件中时可用 public void WriteData(string dataWh, string filePath) { EventWaitHandle waitHa ...

  6. Qt程序打包发布方法(使用官方提供的windeployqt工具)

    Qt程序打包发布方法(使用官方提供的windeployqt工具) 转自:http://tieba.baidu.com/p/3730103947?qq-pf-to=pcqq.group Qt 官方开发环 ...

  7. MySQL 常用数据存储引擎区别

    mysql有多种存储引擎,目前常用的是 MyISAM 和 InnoDB 这两个引擎,除了这两个引擎以为还有许多其他引擎,有官方的,也有一些公司自己研发的.这篇文章主要简单概述一下常用常见的 MySQL ...

  8. Cannot read property 'apply' of undefined

    ...TypeError: Cannot read property 'apply' of undefined :一般都是作用域不对 ...TypeError: Cannot read propert ...

  9. [Erlang-0016][aque_tcp] 一个 Erlang TCP 组件

    项目地址:https://github.com/liangjingyang/aque_tcp 欢迎任何形式的转载,但请务必注明出处:http://www.cnblogs.com/liangjingya ...

  10. mstsc也要使用/admin参数

    mstsc.exe /admin http://stackoverflow.com/questions/6757232/service-not-responding-error-1053