Python 共享变量加锁、释放详解

 更新时间:2019年08月28日 09:14:30   作者:心悦君兮君不知-睿  
这篇文章主要介绍了Python 共享变量加锁、释放详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、共享变量

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

例子:

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

https://github.com/ruigege66/Python_learning/blob/master/d25_1_shared_variable_and_lock.py

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

相关文章

  • Python单元测试框架unittest使用方法讲解

    Python单元测试框架unittest使用方法讲解

    这篇文章主要介绍了Python单元测试框架unittest使用方法讲解,本文讲解了unittest概述、命令行接口、测试案例自动搜索、创建测试代码、构建测试套件方法等内容,需要的朋友可以参考下
    2015-04-04
  • PyChon中关于Jekins的详细安装(推荐)

    PyChon中关于Jekins的详细安装(推荐)

    这篇文章主要介绍了PyChon中关于Jekins的详细安装(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Windows系统下安装tensorflow的配置步骤

    Windows系统下安装tensorflow的配置步骤

    这篇文章主要介绍了Windows系统下安装tensorflow,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • python生成n个元素的全组合方法

    python生成n个元素的全组合方法

    今天小编就为大家分享一篇python生成n个元素的全组合方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • python实现整数序列求和

    python实现整数序列求和

    这篇文章主要介绍了python实现整数序列求和,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Python之维度dim的定义及其理解使用方式

    Python之维度dim的定义及其理解使用方式

    这篇文章主要介绍了Python之维度dim的定义及其理解使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Python+Pygame实现趣味足球游戏

    Python+Pygame实现趣味足球游戏

    这篇文章主要为大家分享了一个基于Python和Pygame实现的一个趣味足球游戏,文中的示例代码讲解详细,对我们学习Python有一定帮助,需要的可以参考一下
    2022-05-05
  • python学习之基于Python的人脸识别技术学习

    python学习之基于Python的人脸识别技术学习

    面部识别技术的应用越来越广泛,它广泛应用于安全系统、人机交互、社交媒体、医疗保健等领域。本文介绍了基于Python的人脸识别技术,感兴趣的小伙伴可以参考阅读
    2023-03-03
  • Python实用小知识之对象间的比较

    Python实用小知识之对象间的比较

    == 和 is 是 Python 中对象比较常用的两种方式,简单来说,'==' 操作符比较对象之间的值是否相等,下面这篇文章主要给大家介绍了关于Python实用小知识之对象间比较的相关资料,需要的朋友可以参考下
    2021-10-10
  • python print输出延时,让其立刻输出的方法

    python print输出延时,让其立刻输出的方法

    今天小编就为大家分享一篇python print输出延时,让其立刻输出的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01

最新评论