一、共享变量

共享变量:当多个线程访问同一个变量的时候。会产生共享变量的问题。

例子:

import threading

sum = 0

loopSum = 1000000

def myAdd():

global sum, loopSum

for i in range(1, loopSum):

sum += 1

def myMinu():

global sum, loopSum

for i in range(1, loopSum):

sum -= 1

if __name__ == "__main__":

print("Dont,,,,,,,{0}".format(sum))

t1 = threading.Thread(target = myAdd, args = ())

t2 = threading.Thread(target = myMinu, args = ())

t1.start()

t2.start()

t1.join()

t2.join()

print("Done,,,,,,{0}".format(sum))

正如上面的结果可以看出:并不是我们期望的0,而是-286705,这就是因为我们共享变量了,同时对变量进行了操作,程序并不是原子的。

2.解决方案:使用“锁”,“信号灯”

(1)锁lock:是一个标志,表示一个线程在占用一些资源。

使用方式:先上锁,然后使用共享资源,放心的使用,最后再释放锁,即释放了这个变量。

锁哪个:哪个资源需要共享,那么就锁谁

import threading

sum = 0

loopSum = 1000000

lock = threading.Lock()

# 先生成一个锁的实例

def myAdd():

global sum, loopSum

for i in range(1, loopSum):

lock.acquire()# 这里申请了一把锁

sum += 1

lock.release()# 注意千万不要忘了释放锁

def myMinu():

global sum, loopSum

for i in range(1, loopSum):

lock.acquire()

sum -= 1

lock.release()

if __name__ == "__main__":

print("Done,,,,,,,{0}".format(sum))

t1 = threading.Thread(target = myAdd, args = ())

t2 = threading.Thread(target = myMinu, args = ())

t1.start()

t2.start()

t1.join()

t2.join()

print("Done,,,,,,{0}".format(sum))

正如我们所预料的加减的顺序无所谓,但最后是零和游戏,但是上面的那个例子,都也是加减顺序无所谓,但是有一点要知道会存在同时对变量的内存使用的情况,这就存在内存被错写的风险,所以最后结果不对,上面的不是零和游戏。

(2)线程的安全问题:

如果一个资源、变量,他对于多线程来讲,不用加锁,也不会引起任何问题,则称为线程安全;线程不安全的变量类型:list\set\dict;线程安全的变量类型:queue

二、源码

d25_1_shared_variable_and_lock.py

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

python 加锁_Python 共享变量加锁、释放详解相关推荐

  1. mongodb python 大于_Python中使用MongoDB详解

    作者:Zarten知乎专栏:Python爬虫深入详解知乎ID: Zarten简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 ! 介绍 MongoD ...

  2. python calu()_python使用配置文件过程详解

    这篇文章主要介绍了python使用配置文件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通过配置文件将变量暴露给用户修改 标准库模块con ...

  3. python 缩进_Python缩进和冒号详解

    对于Python而言代码缩进是一种语法,Python没有像其他语言一样采用{}或者begin...end分隔代码块,而是采用代码缩进和冒号来区分代码之间的层次. 缩进的空白数量是可变的,但是所有代码块 ...

  4. python算术运算_Python 的二元算术运算详解

    相关学习推荐:python教程 大家对我解读属性访问的博客文章反应热烈,这启发了我再写一篇关于 Python 有多少语法实际上只是语法糖的文章.在本文中,我想谈谈二元算术运算. 具体来说,我想解读减法 ...

  5. python优先队列_python 多线程优先队列Queue详解

    Queue模块允许创建指定长度的队列. 下面是Queue模块的常用方法: get():删除并返回队列中的一个项目 put(): 添加项目到队列 qsize() : 返回队列中元素的个数 empty() ...

  6. python 计时_Python计时相关操作详解【time,datetime】

    本文实例讲述了Python计时相关操作.分享给大家供大家参考,具体如下: 内容目录: 1. 时间戳 2. 当前时间 3. 时间差 4. python中时间日期格式化符号 5. 例子 一.时间戳 时间戳 ...

  7. 爬虫软件python功能_Python 网络爬虫程序详解

    #!/usr/bin/python #调用python from sys import argv #导入sys是导入python解释器和他环境相关的参数 from os import makedirs ...

  8. python 柱形图_Python 写入 Excel III 详解图形生成-柱形图

    ------------------------说在前面的话----------------------------- 一直觉得Excel的制图是最美的,尽管本人有多年Maltab使用经历,但是每次都 ...

  9. python随机数生成_Python随机数生成模块random详解

    一.概述 random模块 用于生成伪随机数 之所以称之为伪随机数,是因为真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的.而 ...

最新文章

  1. jquery很好的学习网站
  2. html里range怎么改样式,CSS之修改input range样式 [ lion1ou ]
  3. IT职场人生系列之二十一:如何学习新语言(一)
  4. Hibernate 、多表关联映射-组件关联映射(component)
  5. python虽然火为什么工作少_学 Python 的理由千万条,不秃第一条
  6. WPF案例:如何设计历史记录查看UI
  7. Flink DDL的java代碼中的DeserializationSchemaFactory與TableSourceFactory報錯解決方案記錄彙總
  8. SAP成都研究院马洪波:提升学习力,增强竞争力,收获一生乐趣
  9. java 中 image 和 byte[] 相互转换
  10. php 加载redise_PHP Redis扩展无法加载的问题解决方法
  11. python des加密文件_Python DES加密解密方法 pyDes库 兼容中文
  12. JZOJ.5325【NOIP2017模拟8.21】九九归一
  13. python异常捕获try except
  14. 谷歌浏览器代理服务器出现问题怎么办?(最快的解决办法)
  15. python中round函数参数有负数_Python中round函数使用注意事项
  16. COSO流动性协议和跨链协议,能否解决流动性难题?
  17. Android之内存泄漏调试学习与总结,完整PDF
  18. stricmp linux 头文件,strcmp/strncmp/stricmp(windows) strcasecmp/strncasecmp(linux)
  19. 哪种加密的PDF可以破解?有哪些PDF解密方法?
  20. linux内核烧写erasing failed,TQIMX6UL开发板手动烧写具体方法

热门文章

  1. 几级工作台做石头高墙_创造与魔法:建筑新手入门攻略,家园建材怎么做
  2. opencv特征提取1-Harris角点检测
  3. 移动端iphone抓包调试神器—Stream安装和使用(一)
  4. Android App性能測试
  5. USACO Section 4.2 Drainage Ditches(最大流)
  6. Algorithm(1) - Karatsuba multiplication
  7. InfoPath Resource Sites
  8. Windows管道技术
  9. OpenResty+Lua+redis+mysql实现高性能高可用限流缓存
  10. Centos启动卡住,starting auditd: [failed]