Python_关于多线程下变量赋值取值的一点研究

简介: Python_关于多线程下变量赋值取值的一点研究

关于多线程下变量赋值取值的一点研究

 

1.代码实践1

#!/usr/bin/env python
# -*- coding:utf-8 -*-

__author__ ='shouke'

#!/usr/bin/env python
# -*- coding:utf-8 -*-

importthreading
importtime

classTestClass:
   def__init__(self, num):
       self.num = num

global_var =0
deftestfn(num, obj):
   global  global_var
   global_var = num
   local_var = num *2
   obj.num = num *2
   time.sleep(5)

   print("thread id:", threading.get_ident(),'num:', num,'obj.num:', obj.num,'local_var:', local_var,'global_var:', global_var)

foriinrange(0,5):
   # # 多线程执行性能监控
   thread = threading.Thread(target=testfn,
                             name="testfn"+str(i),
                             args=(i, TestClass(i)))
   thread.start()

 

 

 

 

结论:

1、如下,通过args给线程即将调用函数(为方便描述,暂且称它为 “线程函数”)传递参数,可以做到每个线程都使用各自的参数去调用线程函数。

thread = threading.Thread(target=testfn,
                             name="testfn"+str(i),
                             args=(i, TestClass(i)))

2、如下,线程函数里的局部变量(例中除去global_var之外的变量),都存储在栈内存中,而每个线程都有自己的栈内存,彼此独立,所以,每个线程对局部变量的赋值,读取操作互不影响。也就是说,多线程并发的情况下,局部变量是“安全”的,而全局变量存储在堆内存中,堆内存为所有线程共享,对所有线程都是可见的,所以两个以上的线程访问全局变量时,就会出现所谓的“不安全”,如下,第一个线程访问了全局变量 global_var,赋值为对应的num,然后中间sleep5秒,在此期间,另一个线程访问了全局变量,赋值为另一个num,然后第一个线程醒来了,发现全局变量 global_var 已经不是它要的值了。

deftestfn(num, obj):
   global  global_var
   global_var = num
   local_var = num *2
   obj.num = num *2
   time.sleep(5)

2.代码实践2

#!/usr/bin/env python
# -*- coding:utf-8 -*-

importthreading
importtime


thread_local_obj = threading.local()

classTestClass:
   def__init__(self, num):
       self.num = num

global_var =0
deftestfn(num, obj):
   global  global_var
   global_var = num
   local_var = num *2
   obj.num = num *2

   thread_local_obj.obj = obj
   time.sleep(5)


   other_task()

   print("thread id:", threading.get_ident(),'num:', num,'obj.num:', obj.num,'local_var:', local_var,'global_var:', global_var)

defother_task():
   print("thread id:", threading.get_ident(),'obj.num:', thread_local_obj.obj.num , threading.currentThread().name)


foriinrange(0,5):
   # # 多线程执行性能监控
   thread = threading.Thread(target=testfn,
                             name="testfn"+str(i),
                             args=(i, TestClass(i)))
   thread.start()

 


 


如上,线程函数中调用了另一个函数,我们希望在这个函数中做些操作,比如读取和线程关联的对象的属性值、修改属性值,这个按常规思维也可以通过传递函数参数来实现,  如下 

other_task(obj):

print(obj.num)

问题是,线程函数里可能会调用多个函数,被调用的每个函数也可能会调用多个函数,所有这些函数都可能用到线程关联的对像,这样的话,需要逐层传递参数,很麻烦

 

解决方案:

创建全局对象,如下

thread_local_obj = threading.local()

然后在线程函数里通过thread_local_obj.attr = xxx 的方式,绑定线程关联的东西,其它地方使用时,会自动匹配与线程关联的值

目录
相关文章
|
1月前
|
机器学习/深度学习 算法 调度
基于多动作深度强化学习的柔性车间调度研究(Python代码实现)
基于多动作深度强化学习的柔性车间调度研究(Python代码实现)
128 1
|
2月前
|
机器学习/深度学习 数据采集 数据挖掘
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
|
3天前
|
数据可视化 大数据 关系型数据库
基于python大数据技术的医疗数据分析与研究
在数字化时代,医疗数据呈爆炸式增长,涵盖患者信息、检查指标、生活方式等。大数据技术助力疾病预测、资源优化与智慧医疗发展,结合Python、MySQL与B/S架构,推动医疗系统高效实现。
|
11天前
|
索引 Python
Python 列表切片赋值教程:掌握 “移花接木” 式列表修改技巧
本文通过生动的“嫁接”比喻,讲解Python列表切片赋值操作。切片可修改原列表内容,实现头部、尾部或中间元素替换,支持不等长赋值,灵活实现列表结构更新。
84 1
|
5天前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
38 0
|
1月前
|
机器学习/深度学习 数据采集 并行计算
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
228 2
|
1月前
|
机器学习/深度学习 数据采集 算法
独家原创 | CEEMDAN-CNN-GRU-GlobalAttention + XGBoost组合预测研究(Python代码实现)
独家原创 | CEEMDAN-CNN-GRU-GlobalAttention + XGBoost组合预测研究(Python代码实现)
|
1月前
|
机器学习/深度学习 算法 安全
【强化学习应用(八)】基于Q-learning的无人机物流路径规划研究(Python代码实现)
【强化学习应用(八)】基于Q-learning的无人机物流路径规划研究(Python代码实现)
115 6
|
1月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于A*算法的机器人路径规划研究(Python代码实现)
【机器人路径规划】基于A*算法的机器人路径规划研究(Python代码实现)
238 4
|
1月前
|
JavaScript 关系型数据库 MySQL
基于python的医院智慧门诊系统研究
本系统基于Python和Django框架,结合MySQL、Vue等技术,构建功能全面、易用性强的医院智慧门诊平台。系统涵盖患者与医务人员信息管理、在线挂号、智能导诊、电子病历、远程医疗等功能,优化就医流程,提升医疗效率与服务质量,助力医疗服务数字化转型。
基于python的医院智慧门诊系统研究

推荐镜像

更多