python多线程同步与互斥_python多线程编程(3): 使用互斥锁同步线程

问题的提出

上一节的例子中,每个线程互相独立,相互之间没有任何关系。现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1。很容易写出这样的代码:

#encoding: UTF-8import threading

import time

class MyThread(threading.Thread):

def run(self):

global num

time.sleep(1)

num = num+1

msg = self.name+'set num to '+str(num)

print(msg)

num = 0

def test():

for i in range(5):

t = MyThread()

t.start()

if __name__ == '__main__':

test()

但是运行结果是不正确的:

Thread-5 set num to 2

Thread-3 set num to 3

Thread-2 set num to 5

Thread-1 set num to 5

Thread-4 set num to 4

问题产生的原因就是没有控制多个线程对同一资源的访问,对数据造成破坏,使得线程运行的结果不可预期。这种现象称为“线程不安全”。

互斥锁同步

上面的例子引出了多线程编程的最常见问题:数据共享。当多个线程都修改某一个共享数据的时候,需要进行同步控制。

线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。互斥锁为资源引入一个状态:锁定/非锁定。某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。

threading模块中定义了Lock类,可以方便的处理锁定:

#创建锁mutex = threading.Lock()

#锁定mutex.acquire([timeout])

#释放mutex.release()

其中,锁定方法acquire可以有一个超时时间的可选参数timeout。如果设定了timeout,则在超时后通过返回值可以判断是否得到了锁,从而可以进行一些其他的处理。

使用互斥锁实现上面的例子的代码如下:

import threading

import time

class MyThread(threading.Thread):

def run(self):

global num

time.sleep(1)

if mutex.acquire(1):

num = num+1

msg = self.name+'set num to '+str(num)

print(msg)

mutex.release()

num = 0

mutex = threading.Lock()

def test():

for i in range(5):

t = MyThread()

t.start()

if __name__ == '__main__':

test()

运行结果:

Thread-3 set num to 1

Thread-4 set num to 2

Thread-5 set num to 3

Thread-2 set num to 4

Thread-1 set num to 5

可以看到,加入互斥锁后,运行结果与预期相符。

同步阻塞

当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“同步阻塞”(参见多线程的基本概念)。

直到拥有锁的线程调用锁的release()方法释放锁之后,锁进入“unlocked”状态。线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行(running)状态。

互斥锁最基本的内容就是这些,下一节将讨论可重入锁(RLock)和死锁问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 商品展示html,HTML5和CSS3实现3D展示商品信息的代码

这篇文章介绍的是关于html5商品展示导购特效是一款3D立体样式的商品信息,非常具有实用价值,需要的朋友可以参考下。强化下perspective和transform:translateZ的用法。传统的商品展示或许并不能很好的吸引用户的注意力,但是如果在展示中添加适…

asp.net程序涉及案例_定制小程序 | 企业在开发小程序前需要满足哪些条件?

目前深圳小程序开发行业发展愈发迅速,小程序开发已成为目前的潮流趋势,制作属于自己的小程序刻不容缓。那么在开发小程序前,企业需要满足什么条件呢?1、注册账号万纵联小编告诉你,要想开发小程序,申请账号是…

封神-核心功能 | 钉钉告警+数据网关

简介: 封神-核心功能 | 钉钉告警数据网关1. 开发背景 1.1 用户痛点 ①租户侧运维能力弱 问题:租户侧,客户没有有效途径,及时地获取实例级的状态、性能、容量的数据。 现状:每日固定时间,驻场需要人肉收集数…

usleep延时0.毫秒_【进阶】用swoole实现订单的延时处理(自动取消,还原库存等)...

文章正文一、业务场景:当客户下单在指定的时间内如果没有付款,那我们需要将这笔订单取消掉,比如好的处理方法是运用延时取消,很多人首先想到的当然是crontab,这个也行,不过这里我们运用swoole的异步毫秒定时…

boa php5.5 移植,BOA+PHP在Tiny6410上的移植

1、下载php-5.2.17.tar.bz22、解压到/vptemp#tar -jxv -f php-5.2.17.tar.bz2 -C /vptemp3、编译# cd /vptemp/php-5.2.17#CCarm-linux-gcc ./configure --hostarm-linux --prefix/opt/php5 --disable-all --enable-pdo --with-sqlite3 --with-sqlite --with-pdo-sqlite --with…

中国电信天翼云进入4.0阶段,打造一朵无处不在的分布式云

11月12日,天翼云在2021国际数字科技展暨天翼智能生态博览会天翼云论坛上,发布并解读了全新升级的天翼云4.0分布式云,同时还推出了以红色为主色调的天翼云全新品牌形象。 天翼云新品牌形象 中国电信集团有限公司副总经理唐珂在致辞中表示&am…

软件开发中 前台、中台、后台英文_最近处处惹人爱的中台到底是什么

在当下互联网圈子里要问什么最火莫过于中台这一概念了,各大公司都开始了一轮跑马圈地似的中台建设,那么到底中台是什么呢?本文我们就来谈谈这个话题。一、什么是前台,后台在以往的互联网企业生产流程中,我们可以将研发…

如何基于MaxCompute快速打通数据仓库和数据湖的湖仓一体实践

简介: MaxCompute 是面向分析的企业级 SaaS 模式云数据仓库,以 Serverless 架构提供快速、全托管的在线数据仓库服务,消除了传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您可以经济并高效的分析处…

数仓架构的持续演进与发展 — 云原生、湖仓一体、离线实时一体、SaaS模式

简介: 数据仓库概念从1990年提出,经过了四个主要阶段。从最初的数据库演进到数据仓库,到MPP架构,到大数据时代的数据仓库,再到今天的云原生的数据仓库。在不断的演进过程中,数据仓库面临着不同的挑战。 作…

华为路由器命令手册_华为路由器+蒲公英路由器,如何做双层路由器映射?

今天上午,有一个客户反馈,他们的软件和linux系统无法实现外网访问了。客户的网络拓扑是这样的,光猫接蒲公英路由器X5,蒲公英路由器的LAN 口IP是192.168.0.1,然后从蒲公英路由器的LAN口连接一根网线到华为路由器WAN口&a…

行业务实派:解锁数据价值,翼方健数全栈隐私安全计算技术

数智化时代,数据已成为最核心、最具价值的生产要素。其中,如何应用可落地的技术,共享和保护数据,促进数据要素进一步流通,释放数据价值,受到业内普遍关注。 隐私计算,被业内誉为打破“数据隐私…

css中分区显示php,CSS中7个你必须知道属性

学习CSS是构建好看网页的一种方式。 但是,在学习过程中,我们倾向于(大部分时间)限制自己,一遍又一遍地使用相同的属性。 毕竟,我们是一种习惯性的动物,我们会使用自己习惯且熟悉的东西。因此,在这篇文章中&…

ctrl c 失效了_[安卓+PC双端]超C女仆无馬中字

这周基本啥也没发,传个小游戏吧就~点赞(150) 投币(随缘)推荐用用吉里吉里模拟器玩~应该是女仆类的游戏,我没玩过也不清楚哦链接失效我就不补了,如果点赞在今天内达标,那就今晚20:00补发,不要错…

浅谈分布式一致性:Raft 与 SOFAJRaft

简介: SOFAJRaft已开源 作者 | 家纯 来源 | 阿里技术公众号 一 分布式共识算法 (Consensus Algorithm) 1 如何理解分布式共识? 多个参与者针对某一件事达成完全一致:一件事,一个结论。 已达成一致的结论,不可推翻。 2 有哪些…

OpenKruise v0.9.0 版本发布:新增 Pod 重启、删除防护等重磅功能

简介: OpenKruise 是阿里云开源的云原生应用自动化管理套件,也是当前托管在 Cloud Native Computing Foundation (CNCF) 下的 Sandbox 项目。它来自阿里巴巴多年来容器化、云原生的技术沉淀,是阿里内部生产环境大规模应用的基于 Kubernetes 之…

00后确实卷,公司新来的卷王,我们这帮老油条真干不过.....

都说00后躺平了,但是有一说一,该卷的还是卷。这不,前段时间我们公司来了个00后,工作没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。最…

rsa 返回值 验签 失败_解析蛋糕、面包制作失败的原因

其实这些问题的答案大多都隐藏在搅拌盘、烤炉和烤盘中掌握好这些基础知识就能告别这些常见的失误01﹏﹏﹏好的蛋糕始于搅拌盘做蛋糕的过程实质上是化学变化的过程,一系列的配料遵照严格的顺序倒入搅拌盘里混合并产生特殊效应。想做出蛋糕心松软、湿润和细腻质感的黄…

日期 java cal,日期系列教材 (三)- 如何使用Java的Calendar类

代码比较复制代码package date;import java.text.SimpleDateFormat;//import java.util.Calendar;import java.util.Date;public class TestDate {private static SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static void main(Strin…

阿里云资深技术专家李克畅谈边缘云计算趋势与实践

简介: 2021年5月15日,以“相信边缘的力量”为主题的全球边缘计算大会在深圳成功召开。 阿里云资深技术专家李克,分享阿里云在边缘云计算的探索和实践,如何为行业提供广覆盖、低成本、高可靠的边缘基础设施。 2021年5月15日&#…

python编写程序接收字符串_Python字符串操作

a Hellob Python一、字符串运算符1.字符串连接()字符串1 ‘字符串2’>>>print(a b)HelloPython2.重复输出字符串(*)字符串 * n>>>print(a * 2)HelloHello3.通过索引获取目标字符([])索引从0开始。>>>print(a[1])e4.切片,截取字符串(…