Python高阶之多线程锁机制
'''
1.多进程的优势:为了同步完成多项任务,通过提高资源使用效率来提高系统的效率。
2.查看线程数:threading.enumerate()函数便可以看到当前线程的数量。
3.查看当前线程的名字:threading.current_thread()可以看到当前线程的信息。
4.类可以继承 threading.Thread
'''
# import threading
# import time
#
# class CodingThread(threading.Thread):
# def run(self):
# for x in range(3):
# print('正在写脚本:%s'%threading.current_thread())
# time.sleep(1)
#
# class ModelThread(threading.Thread):
# def run(self):
# for x in range(3):
# print('正在创建模型:%s'%threading.current_thread())
# time.sleep(1)
#
# # 主线程入口
# def main():
# t1 = CodingThread()
# t2 = ModelThread()
#
# t1.start()
# t2.start()
#
#
# if __name__ == '__main__':
# main()
# 多线程共享全局变量的问题:
'''
多线程都是在同一个进程中运行的。因此在进程中的全局变量所有线程都是可共享的。
这就造成了一个问题,因为线程执行的顺序是无序的。有可能会造成数据错误。
'''
# import threading
# VALUES = 0
# 全局变量使用线程时,避免数据不出现乱序,则加上锁
# gLock = threading.Lock()
#
# def get_ticket():
# global VALUES
# # 加锁
# gLock.acquire()
# for x in range(100000):
# VALUES += 1
# # 解锁
# gLock.release()
# print('VALUES:%d' % VALUES)
#
# def main():
# for x in range(3):
# t = threading.Thread(target=get_ticket)
# t.start()
# 应该打印出来是: 100000,200000,300000
# 实际打印出来是: 100000,124976,224976
# 所有使用到threading.Lock
'''
加上锁后返回的值:
VALUES:100000
VALUES:200000
VALUES:300000
'''
# if __name__ == '__main__':
# main()
# Lock版本生产者和消费者模式:
'''
生产者和消费者模式是多线程开发中经常见到的一种模式。
生产者的线程专门用来生产一些数据,然后存放到一个中间的变量中。
消费者再从这个中间的变量中取出数据进行消费。
但是因为要使用中间变量,中间变量经常是一些全局变量,因此需要使用锁来保证数据完整性。
使用threading.Lock锁实现的“生产者与消费者模式”的一个例子:
'''
import threading
import random
import time
gMoney = 1000
glock = threading.Lock()
# 记录生产者生产的次数,达到10次就不再生产
gtime = 0
# 生产者
class Producer(threading.Thread):
def run(self):
global gMoney
global gtime
while True:
Money = random.randint(100,1000)
glock.acquire()
if gtime >= 10:
# 解锁返回
glock.release()
break
gMoney += Money
print('%s存入了%d元钱,还剩%d元钱'%(threading.current_thread(),Money,gMoney))
time.sleep(0.5)
gtime += 1
glock.release()
# 消费者
class Consumer(threading.Thread):
def run(self):
global gMoney
global gtime
while True:
Money = random.randint(100, 1000)
glock.acquire()
if gMoney > Money:
gMoney -= Money
print('%s消费了%d元钱,还剩%d元钱' % (threading.current_thread(), Money, gMoney))
time.sleep(0.5)
else:
# 如果钱不够了,有可能是已经超过了次数,这时候就判断一下
if gtime >= 10:
glock.release()
break
print('%s消费了%d元钱,还剩%d元钱,不足!!!' % (threading.current_thread(), Money, gMoney))
glock.release()
def main():
for x in range(3):
c1 = Consumer(name='消费者线程数%s'%x)
c1.start()
for x in range(5):
p1 = Producer(name='生产者线程数%s'%x)
p1.start()
if __name__ == '__main__':
main()
Python高阶之多线程锁机制的更多相关文章
- Python开发基础-Day30多线程锁机制
GIL(全局解释器锁) GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念,是为了实现不同线程对共享资源访问的互斥,才引入了GIL 在Cpython解释器 ...
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
- Python高阶函数_map/reduce/filter函数
本篇将开始介绍python高阶函数map/reduce/filter的用法,更多内容请参考:Python学习指南 map/reduce Python内建了map()和reduce()函数. 如果你读过 ...
- Python高阶函数及函数柯里化
1 Python高阶函数 接收函数为参数,或者把函数作为结果返回的函数为高阶函数. 1.1 自定义sort函数 要求:仿照内建函数sorted,自行实现一个sort函数.内建函数sorted函数是返回 ...
- python——高阶函数:高阶函数
python高阶函数 00初识高阶函数 一等公民 函数在python中是一等公民(First-Class Object),同样和变量一样,函数也是对象,只不过是可调用的对象,所以函数也可以作为一个普通 ...
- python高阶函数的使用
目录 python高阶函数的使用 1.map 2.reduce 3.filter 4.sorted 5.小结 python高阶函数的使用 1.map Python内建了map()函数,map()函数接 ...
- Python高阶用法总结
目录 1. lambda匿名函数 1.1 函数式编程 1.2 应用在闭包 2. 列表解析式 3. enumerate内建函数 4. 迭代器与生成器 4.1 迭代器 4.3 生成器 5. 装饰器 前言: ...
- python 高阶函数之filter
前文说到python高阶函数之map,相信大家对python中的高阶函数有所了解,此次继续分享python中的另一个高阶函数filter. 先看一下filter() 函数签名 >>> ...
- python 多线程锁机制
GIL(全局解释器锁) GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念,是为了实现不同线程对共享资源访问的互斥,才引入了GIL 在Cpython解释器 ...
随机推荐
- JUC 并发编程--11, AQS源码原理解析, ReentrantLock 源码解读
这里引用别人博客,不重复造轮子 https://blog.csdn.net/u012881584/article/details/105886486 https://www.cnblogs.com/w ...
- Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer
作者:Grey 原文地址:Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer ByteBuffer.allocate()与ByteBuffer.allocateD ...
- 【题解】【洛谷 P1967】 货车运输
目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...
- 【NX二次开发】根据视图名称获取视图的矩阵
函数:uc6433 () 函数说明:获取视图名称对应的矩阵值.视图名称分为几类: 1. 制图中的视图,右键属性可以查看名称 获取上图中的视图的矩阵: 1 double v_mtx[9] = { 1.0 ...
- 前台使用Vue
前台搭建遇到问题 ----前台访问量大 未采用vue 单页面SAP 的方式构建 使用多HTML构建页面 项目构建 vue 2.6 https://cn.vuejs.org/ elementUI htt ...
- ClickHouse源码笔记6:探究列式存储系统的排序
分析完成了聚合以及向量化过滤,向量化的函数计算之后.本篇,笔者将分析数据库的一个重要算子:排序.让我们从源码的角度来剖析ClickHouse作为列式存储系统是如何实现排序的. 本系列文章的源码分析基于 ...
- kubernetes的存活探针和就绪探针
1.存活探针 使用Kubernetes的一个主要好处是,可以给Kubernetes-个容器列表来由其保持容器在集群中的运行.可以通过让Kubernetes创建pod资源,为其选择一个工作节点并在该节点 ...
- 26、mysqlsla慢查询日志分析工具
1.介绍: mysqlsla是hackmysql.com推出的一款MySQL的日志分析工具,可以分析mysql的慢查询日志.分析慢查询非常好用,能针 对库分析慢查询语句的执行频率.扫描的数据量.消耗时 ...
- 应用CRM的自动化功能为什么备受推崇
相信每个销售团队都遇到过这样的问题:在跟进新客户的时候顾此失彼,在跟踪一个客户的时候,转眼就忘记了另一个客户.这种情况很常见,但是每个新客户都有潜在的价值,我们该如何做,才能避免错失商机?CRM客户管 ...
- python cv2获取视频第一帧,并转码
安装Python库 sudo pip install opencv-python 或者sudo pip install opencv-python -i https://pypi.douban.com ...