前段时间看了下flask的源码,对于这样一个轻量级的web框架是怎样支持多线程的感到非常好奇,于是深入了解了一番。

flask是依赖werkeug来实现线程间的隔离的,而werkeug最后又使用到了python的内置模块locals来承载数据,看不如写,于是自己实现了一下。

from threading importcurrentThread, Threadfrom collections importdefaultdictimportsysclassLocalProxy(object):def __init__(self):

self.local=defaultdict(dict)def __repr__(self):returnstr(self.local)def __str__(self):returnstr(self.local)def __getitem__(self, item):returnself.local[currentThread().ident][item]def __setitem__(self, key, value):

self.local[currentThread().ident].update({key: value})print(sys.version)

local_proxy=LocalProxy()print(local_proxy)

local_proxy["main"] = "start"

defchange_property():

local_proxy["main"] = "end"change_thread= Thread(target=change_property)

change_thread.daemon=True

change_thread.start()

change_thread.join()print(local_proxy)

输出:

3.7.3 (default, Mar 27 2019, 17:13:21) [MSC v.1915 64bit (AMD64)]

defaultdict(, {})

defaultdict(, {7092: {‘main‘: ‘start‘}, 4892: {‘main‘: ‘end‘}})

这里是使用locals来作为数据承载的dict,然后使用currentThread方法获取当前线程id,以此作为key来实现各线程间的数据隔离。

从输出可以看出,主线程设置了`main=start`后,子线程对该属性进行修改并未成功,而是在自己的线程id下创建了新的属性。

实现过程中还发生了一个小插曲,当时的开启线程代码如下:

change_thread =Thread(change_property)

change_thread.daemon=True

change_thread.start()

报错:

Traceback (most recent call last):3.7.3 (default, Mar 27 2019, 17:13:21) [MSC v.1915 64bit (AMD64)]

defaultdict(, {})

File"E:/project/blog/blog/src/utils/local_.py", line 34, in change_thread=Thread(change_property)

File"D:UsersAdministratorAnaconda3libhreading.py", line 781, in __init__

assert group is None, "group argument must be None for now"AssertionError: group argument must be Nonefor now

于是点开Thread源码看看这个group为何物:

def __init__(self, group=None, target=None, name=None,

args=(), kwargs=None, *, daemon=None):"""This constructor should always be called with keyword arguments. Arguments are:

*group* should be None; reserved for future extension when a ThreadGroup

class is implemented.

原来Thread的初始化增加了group参数,切对其进行了断言,为以后即将实现的ThreadGroup铺路。

ps: 以后传参还是尽量带上参数名。

Python的线程隔离实现方法

python3 线程隔离_Python的线程隔离实现方法相关推荐

  1. python3多线程编程_Python 3-多线程编程

    Python 3-多线程编程 运行多个线程类似于同时运行多个不同的程序,但具有以下优点- 进程中的多个线程与主线程共享相同的数据空间,因此与单独的进程相比,可以更轻松地共享信息或彼此通信. 线程有时被 ...

  2. python的进程和线程定位_Python | 进程 线程的理解拾遗

    进程和线程的理解 线程是操作系统能够进行预算调度的最小单位,它包含在进程中是进程中的实际运作单位. Linux 进程有父进程和子进程,window 系统的进程是平等关系 一个标准的线程有线程 ID , ...

  3. python线程退出_python子线程退出及线程退出控制的代码

    下面通过代码给大家介绍python子线程退出问题,具体内容如下所示: def thread_func(): while True: #do something #do something #do so ...

  4. python线程回收_python之线程

    开启一个字处理软件进程,该进程肯定需要办不止一件事情,比如监听键盘输入,处理文字,定时自动将文字保存到硬盘,这三个任务操作的都是同一块数据,因而不能用多进程.只能在一个进程里并发地开启三个线程,如果是 ...

  5. python线程监控_Python实现线程状态监测简单示例

    本文实例讲述了Python实现线程状态监测.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- from threading import Thread import ti ...

  6. python 线程锁_Python多线程-线程锁

    多线程修改一份数据时需要用到线程锁,以防止数据修改出错 #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import threa ...

  7. python3 线程隔离_Python并发编程之线程中的信息隔离(五)

    大家好,并发编程 进入第三篇. 上班第一天,大家应该比较忙吧.小明也是呢,所以今天的内容也很少.只要几分钟就能学完. 昨天我们说,线程与线程之间要通过消息通信来控制程序的执行. 讲完了消息通信,今天就 ...

  8. Hystrix面试 - 基于 Hystrix 线程池技术实现资源隔离

    Hystrix面试 - 基于 Hystrix 线程池技术实现资源隔离 上一讲提到,如果从 Nginx 开始,缓存都失效了,Nginx 会直接通过缓存服务调用商品服务获取最新商品数据(我们基于电商项目做 ...

  9. hystrix 源码 线程池隔离_springcloud-线程池隔离(consumer)ribbon

    1.线程池隔离原理图 2.线程池隔离 1.线程池隔离应用于consumer调用provider,正常情况下浏览器发送请求到consumer, consumer调用provider使用的是同一线程 2. ...

最新文章

  1. netty之ObjectSizeEstimator
  2. cartographer坐标系_cartographer 调参(1)-lua文件配置参考文档
  3. 每个程序员都必须遵守的编程原则
  4. java五种加密技术理解
  5. 迭代求斐波那契数列python_python中的迭代器(以斐波那契数列为主讲解)
  6. linux 环境 crontab+shell+sqlplus 调用oracle 存储过程实现数据同步
  7. Nodejs学习笔记(一)——基础之全局对象、包和npm
  8. c语言水利工程编程题目,C程序设计(双语版)习题答案精选.doc
  9. 周鸿祎谈李国庆夫妇互撕:大事男人说了算,小事才听女人的
  10. 福州大学第十四届程序设计竞赛-重现赛(Record)
  11. RUP---统一软件开发过程
  12. 群晖消息通知 推送服务器,群晖NAS发送钉钉群消息通知教程
  13. 《程序设计基础课程设计》实验报告
  14. 三菱plc pwm指令_三菱PLC高速处理指令编程
  15. Apache DolphinScheduler 3.0 正式版重磅发布
  16. win10网络诊断为DNS服务器未响应,Windows10网络诊断DNS服务器未响应的解决办法
  17. arcgis for javascript 4.18 添加图片到地图(可用于实现雷达图片上图)
  18. html css 悬浮切换效果,CSS3悬浮动画效果_html/css_WEB-ITnose
  19. Java类有个星号标记_Java中import包带*(星号)问题
  20. Web前端工程师就业前景怎么样?整体薪资待遇好不好?

热门文章

  1. 土城战役_避免使用FOR –反假战役
  2. 设计模式 工厂方法_使用工厂方法模式设计最佳实践
  3. spring shell_Spring Shell项目发布
  4. 在NetBeans,Eclipse,IntelliJ,OpenShift和Maven上使用WildFly 9
  5. Windows上的Oracle Java
  6. Java Web App体系结构
  7. Guava的测试集合实现
  8. Oracle MAF中的LOV
  9. 了解Spring Web应用程序体系结构:经典方法
  10. 带有Swagger的Spring Rest API –集成和配置