Python 共享变量加锁、释放详解
作者:心悦君兮君不知-睿 发布时间:2022-08-25 09:19:26
标签: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
来源:https://www.cnblogs.com/ruigege0000/p/11421552.html
0
投稿
猜你喜欢
- replace方法的语法是:stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(st
- 需求如下: 1.模板页右边包含了一个登陆div,想让没登陆的时候这个div显示,登陆后该div隐藏 2.显示一个欢迎用户的div,主要是想通
- 前言要想学好爬虫,必须把基础打扎实,之前发布了两篇文章,分别是使用XPATH和requests爬取网页,今天的文章是学习Beautiful
- 一、低配logging日志总共分为以下五个级别,这个五个级别自下而上进行匹配 debug-->info-->warning--&
- python3 在服务器上打印资产信息pip3 install prettytableurl 为 资产信息接口地址,返回为json信息。#
- 如何做一个可以让人家申请使用的计数器? 好了,我们来做一个与页面分离的计数器,是文本型的啦。这也很简单,
- 1.首先检查自己的环境变量是否配置正确点击setting 点击 Python Interpreter点击Add Interpret
- 前言本文主要给大家介绍的是关于在Python3使用PyMongo的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细介绍:Mong
- 经常在办公的过程中会遇到各种各样的压缩文件处理,但是呢每个压缩软件支持的格式又是不同的。没有可以一种可以同时多种格式的并且免费的文件解压缩工
- 一、requests库1、requests简介requests库就是一个发起请求的第三方库,requests允许你发送HTTP/1.1 请求
- 支持CSS属性Safari和WebKit实施大子的CSS 2.1规格所界定的万维网联盟( W3C ) ,以及部分的CSS 3规格。 。这个C
- 如下所示:ffmpeg中文文档:http://linux.51yip.com/search/ffmpegffmpeg -i test_bao
- 此文仅当学习笔记用.这个实例是在Python环境下如何爬取弹出窗口的内容,有些时候我们要在页面中通过点击,然后在弹出窗口中才有我们要的信息,
- 一、读取整个文件内容在读取文件之前,我们先创建一个文本文件resource.txt作为源文件。resource.txtmy name is
- #!/usr/bin/env python# -*- coding:utf-8-*-# file: {NAME}.py# @author:
- 在windows平台上使用pyhton编写语音识别程序需要用到speech模块,speech模块支持的主要功能有:文本合成语音,将键盘输入的
- Google Chrome,又喜欢逛豆瓣,Google Chrome支持User Scripts了,但是我写的那几个插件在Chrome下又跑
- 为了画个图,被numpy这个模块的安装真的折腾疯了!!!一直装不上,花了几个小时,看了网上的很多教程、方法发现总结得不是很全,这里总结一下,
- Hedger Wang 在国内 blog 上得到的方法:使用 try … finally 结构来使对象最终为 null ,以阻止内存泄露。其
- 格式getopt(args, options[, long_options])1.args表示要解析的参数. 2.options表示脚本要识