一、threading.loacl方法

import threading
import time class Foo:
pass foo = Foo() def func(num):
foo.num = num
time.sleep(1) # 都睡一秒 还没来得及输出,就被后来的线程改了,所以等睡完之后,所有线程打印的num就都变为都后一次改得了
print(foo.num, threading.current_thread().ident) for i in range(20):
th = threading.Thread(target=func, args=(i, ))
th.start()
33760
29392
21292
5480
10516
29424
35968
10936
13416
28340
33644
34604
11892
15340
33676
9956
14248
31560
28108
5080

我们使用threading.local来存储num,再看看结果:

import threading
import time
from threading import local class Foo:
pass # foo = Foo()
foo = local() def func(num):
foo.num = num
time.sleep(1)
print(foo.num, threading.current_thread().ident) for i in range(20):
th = threading.Thread(target=func, args=(i, ))
th.start()

结果:

C:\Python36\python.exe D:/my_flask/flask_third/test.py
23080
21992
26988
38836
13956
27856
24248
32728
12424
9140
26344
32020
9040
28664
32160
19468
20176
26072
17884
18232

可以看到,当我们把数据使用local对象时,不同之间线程数据是隔离的,赋值不会互相影响!

threading.local()这个方法的特点用来保存一个全局变量,但是这个全局变量只有在当前线程才能访问,

foo.num = num这条语句可以储存一个变量到当前线程,如果在另外一个线程里面再次对foo.num进行赋值,

那么会在另外一个线程单独创建内存空间来存储,也就是说在不同的线程里面赋值 不会覆盖之前的值,因为每个

线程里面都有一个单独的空间来保存这个数据,而且这个数据是隔离的,其他线程无法访问

这个东西可以用在那些地方呢,比如下载,现在都是多线程下载了,就像酷狗那样,可以同时下载很多首歌曲,那么

就可以利用这个方法来保存每个下载线程的数据,比如下载进度,下载速度之类的

所以  如果你在开发多线程应用的时候  需要每个线程保存一个单独的数据供当前线程操作,可以考虑使用这个方法,简单有效

其实这样的功能还有很多种方法可以实现,比如我们在主线程实例化一个dict对象,然后用线程的名字作为key,因为线程之间可以共享数据,

所以也可以实现相同功能,并且灵活性更多,不过代码就没那么优雅简洁了

Flask之threading.loacl方法的更多相关文章

  1. python flask实现小项目方法

    本文目的是为了完成一个项目用到的flask基本知识,例子会逐渐加深.最好对着源码,一步一步走. 下载源码,运行 pip install -r requirements.txt 建立环境 python ...

  2. threading.local()方法;线程池

    一,threading.local() import time import threading v = threading.local() def func(arg): # 内部会为当前线程创建一个 ...

  3. Flask关于request一些方法和属性的整理(持续更新)

    前提:基于纯后端服务, post 请求 (Content-Type: application/json,) 1.获取未经处理过的原始数据而不管内容类型,如果数据格式是json的,则取得的是json字符 ...

  4. Flask补充--threading.local对象

    目录 Local 局部变量 全局变量 使用threading.local() 自定义threading.local 函数版 面向对象版 通过setattr和getattr实现 每个对象有自己的存储空间 ...

  5. Flask学习 4 http方法

    服务端端 #!/usr/bin/env python # encoding: utf-8 """ @version: v1.0 @author: cxa @file: f ...

  6. 用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 Jinja 中常用的过滤器 default float int len ...

  7. Flask—路由的注册方法

    第一种注册方法 from flask import Flask app = Flask(__name__) @app.route("/hello") # 第一种注册方法 def h ...

  8. Flask(3)- Flask 中的 HTTP 方法

    查看 app.route() 源代码 def route(self, rule: str, **options: t.Any) -> t.Callable: """ ...

  9. flask自定义处理错误方法

    自定义错误处理方法: 当客户端访问浏览器是,得到相对应的状态码,服务器通过状态码给用户相对应的页面. @app.errorhandler(404) def handle_404_error(err): ...

随机推荐

  1. C语言 sscanf函数补充

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h&g ...

  2. GSON工具类

    import java.util.Map; import com.google.gson.reflect.TypeToken; import com.google.gson.FieldNamingPo ...

  3. win7/win10 设置始终以管理员身份运行cmd窗口

    在桌面上找到cmd快捷方式图标,右键"属性" 4.选择"快捷方式",点击“高级” 5.勾选用管理员身份运行,点击"确定" 6.点击" ...

  4. Block chain 1_The Long Road to Bitcoin

    The path to Bitcoin is littered with the corpses of failed attempts. I've compiled a list of about a ...

  5. strings包 — 汇总

    转自:https://www.jb51.net/article/148388.htm strings 包中的函数和方法 // Count 计算字符串 sep 在 s 中的非重叠个数 // 如果 sep ...

  6. ListModelSerializer模块

    ListModelSerializer模块 一 .自定义反序列化字段 # 一些只参与反序列化的字段,但是不是与数据库关联的 # 在序列化类中规定,并在校验字段时从校验的参数字典中剔除 class Pu ...

  7. Spring Cloud Stream如何消费自己生产的消息

    在上一篇<Spring Cloud Stream如何处理消息重复消费>中,我们通过消费组的配置解决了多实例部署情况下消息重复消费这一入门时的常见问题.本文将继续说说在另外一个被经常问到的问 ...

  8. MySQL Group Replication的安装部署

    一.简介 这次给大家介绍下MySQL官方最新版本5.7.17中GA的新功能 Group Replication . Group Replication是一种可用于实现容错系统的技术.复制组是一组通过消 ...

  9. go 语言学习 ---解析xml

    实例1 //main package main import ( "bytes" "encoding/xml" "fmt" "io ...

  10. Python中logging快速上手教程

    本文使用得日志需要导入logging模块和logging.handlers模块,即 import logging import logging.handlers ''' author = " ...