1.全局变量

多个线程同时对一个全局变量操作,可能会产生脏数据

import threading
global_num = 0def thread_cal():global global_numfor i in range(100000):global_num += 1threads = []
for i in range(10):threads.append(threading.Thread(target=thread_cal))threads[i].start()
for i in range(10): # 必须在全部start之后再join,不然每启动一个线程,主线程都会被阻塞,既10个线程依次进行threads[i].join()
print(global_num) # 值不确定

2.局部变量

每个线程的局部变量是互相受影响的

import threadingdef thread_cal():local_num = 0for _ in range(1000):local_num += 1print(threading.current_thread().getName(), num)threads = []
for i in range(10):threads.append(threading.Thread(target=thread_cal))threads[i].start()

3.使用字典实现全局变量隔离

实际生产环境中,我们可能会调用很多函数,每个函数都需要很多局部变量,每个方法都设置局部变量会很不方便。
为了解决这个问题,一个直观的的方法就是建立一个全局字典,保存进程 ID 到该进程局部变量的映射关系,运行中的线程可以根据自己的 ID 来获取本身拥有的数据。这样,就可以避免在函数调用中传递参数,如下示例:

import threading
global_data = {}def thread_cal():global global_datacur_thread = threading.current_thread()global_data[cur_thread] = 0for _ in range(1000):global_data[cur_thread] += 1print(cur_thread.getName(), global_data[cur_thread])threads = []
for i in range(10):threads.append(threading.Thread(target=thread_cal))threads[i].start()

1.这种做法并不完美。首先,每个函数在需要线程局部数据时,都需要先取得自己的线程ID,略显繁琐。
2.更糟糕的是,这里并没有真正做到线程之间数据的隔离,因为每个线程都可以读取到全局的字典,每个线程都可以对字典内容进行更改。

为了更好解决这个问题,python 线程库实现了 ThreadLocal 变量(很多语言都有类似的实现,比如Java)。ThreadLocal 真正做到了线程之间的数据隔离,并且使用时不需要手动获取自己的线程 ID

4.ThreadLocal

import threading
global_data = threading.local()def thread_cal():global_data.num = 0 # 每个线程调取各自的numfor _ in range(1000):global_data.num += 1print(threading.current_thread().getName(), global_data.num)threads = []
for i in range(10):threads.append(threading.Thread(target=thread_cal))threads[i].start()print("Main thread: ", global_data.__dict__)

python threading.loca讲解相关推荐

  1. python threading模块的方法_Python THREADING模块中的JOIN()方法深入理解

    看了oschina上的两个代码,受益匪浅.其中对join()方法不理解,看python官网文档的介绍: join([timeout]):等待直到进程结束.这将阻塞正在调用的线程,直到被调用join() ...

  2. Python threading Thread多线程的使用方法

    Python threading Thread多线程的使用方法 参考资料:<Python 多线程>http://www.runoob.com/python/python-multithre ...

  3. Python学习笔记- Python threading模块

    Python threading模块 直接调用 # !/usr/bin/env python # -*- coding:utf-8 -*- import threading import timede ...

  4. python threading 结束线程

    python threading 启动的线程,并没有提供终止线程的方法,现总结一下在网上找到的方法 1.通过threading.Thread._Thread__stop()结束线程 import ti ...

  5. python爬虫进阶案例,Python进阶(二十)-Python爬虫实例讲解

    #Python进阶(二十)-Python爬虫实例讲解 本篇博文主要讲解Python爬虫实例,重点包括爬虫技术架构,组成爬虫的关键模块:URL管理器.HTML下载器和HTML解析器. ##爬虫简单架构 ...

  6. 2023年美赛C题Wordle预测问题一建模及Python代码详细讲解

    相关链接 (1)2023年美赛C题Wordle预测问题一建模及Python代码详细讲解 (2)2023年美赛C题Wordle预测问题二建模及Python代码详细讲解 (3)2023年美赛C题Wordl ...

  7. 2023年美赛C题Wordle预测问题三、四建模及Python代码详细讲解

    更新时间:2023-2-19 16:30 相关链接 (1)2023年美赛C题Wordle预测问题一建模及Python代码详细讲解 (2)2023年美赛C题Wordle预测问题二建模及Python代码详 ...

  8. 2023年美赛C题Wordle预测问题二建模及Python代码详细讲解

    更新时间:2023-2-19 相关链接 (1)2023年美赛C题Wordle预测问题一建模及Python代码详细讲解 (2)2023年美赛C题Wordle预测问题二建模及Python代码详细讲解 (3 ...

  9. 「Python爬虫系列讲解」七、基于数据库存储的 BeautifulSoup 招聘爬取

    本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...

最新文章

  1. web浏览器_你最常用的web测试-浏览器兼容性测试
  2. 后勤管理系统_教育信息化2.0,2019年校园智慧后勤管理系统五大品牌
  3. matlab GUI——按下按钮在指定的坐标下绘制函数图像
  4. C#语言之“中英文混合字符串对齐”的方法
  5. 南信大c语言实验8报告,北科大C语言程序设计实验报告8论文报告.doc
  6. ansible常用基础命令整合
  7. 二叉链表和职工管理系统结合_职工信息管理系统单链表实现C语言源程序
  8. java web启动socket_javaweb启动时启动socket服务端代码实现
  9. 4.1 编程语言的几个发展阶段
  10. vr降噪器英文是什么_耳机降噪功能这么多,说说什么是ANC、ENC、CV...
  11. Java高级工程师技能要求参考
  12. 网吧计费管理系统(武汉理工大学大一下实验(C语言版源码))
  13. 智能汽车域控制器的认识
  14. 疑惑!AI中台到底为什么火了?道翰天琼认知智能机器人平台API接口为您揭秘。
  15. 天猫年货节助手、京东年货节助手,自动完成任务领取奖励,解放双手
  16. C++ 九阴真经之单例模式
  17. 游戏建模次世代角色模型制作教程,内藏超级无敌干货!
  18. ipv6 dns修改方法
  19. 第1章第2节:PowerPoint的选项卡 [PowerPoint精美幻灯片实战教程]
  20. STM32——OLED显示实验

热门文章

  1. Python使用传输层安全协议TLS/SSL实现信息加密传输
  2. 微课|玩转Python轻松过二级(1.3节):编码规范与代码优化建议1
  3. varchar 求和 非数值_考研线性代数 解题方法汇总(非知识点汇总)
  4. JVM Class 类文件结构 (系列号2)
  5. python的变量在使用前不需要先赋值_在赋值Python之前引用的另一个局部变量
  6. java 读取大文件内容_java读取大文件
  7. 操作系统锁的实现方法有哪几种_java 偏向锁、轻量级锁及重量级锁synchronized原理...
  8. 1005. K 次取反后最大化的数组和(javascript)
  9. mysql 索引未命中_联合索引命中率问题导致SQL查询效率慢的问题
  10. 坐标定位手机元素_CSS 是如何影响浏览器元素在文档中的排列?