'''
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高阶之多线程锁机制的更多相关文章

  1. Python开发基础-Day30多线程锁机制

    GIL(全局解释器锁) GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念,是为了实现不同线程对共享资源访问的互斥,才引入了GIL 在Cpython解释器 ...

  2. 用一个简单的例子来理解python高阶函数

    ============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...

  3. Python高阶函数_map/reduce/filter函数

    本篇将开始介绍python高阶函数map/reduce/filter的用法,更多内容请参考:Python学习指南 map/reduce Python内建了map()和reduce()函数. 如果你读过 ...

  4. Python高阶函数及函数柯里化

    1 Python高阶函数 接收函数为参数,或者把函数作为结果返回的函数为高阶函数. 1.1 自定义sort函数 要求:仿照内建函数sorted,自行实现一个sort函数.内建函数sorted函数是返回 ...

  5. python——高阶函数:高阶函数

    python高阶函数 00初识高阶函数 一等公民 函数在python中是一等公民(First-Class Object),同样和变量一样,函数也是对象,只不过是可调用的对象,所以函数也可以作为一个普通 ...

  6. python高阶函数的使用

    目录 python高阶函数的使用 1.map 2.reduce 3.filter 4.sorted 5.小结 python高阶函数的使用 1.map Python内建了map()函数,map()函数接 ...

  7. Python高阶用法总结

    目录 1. lambda匿名函数 1.1 函数式编程 1.2 应用在闭包 2. 列表解析式 3. enumerate内建函数 4. 迭代器与生成器 4.1 迭代器 4.3 生成器 5. 装饰器 前言: ...

  8. python 高阶函数之filter

    前文说到python高阶函数之map,相信大家对python中的高阶函数有所了解,此次继续分享python中的另一个高阶函数filter. 先看一下filter() 函数签名 >>> ...

  9. python 多线程锁机制

    GIL(全局解释器锁) GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念,是为了实现不同线程对共享资源访问的互斥,才引入了GIL 在Cpython解释器 ...

随机推荐

  1. 痞子衡嵌入式:嵌入式里通用微秒(microseconds)计时函数框架设计与实现

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是嵌入式里通用微秒(microseconds)计时函数框架设计与实现. 在嵌入式软件开发里,计时可以说是非常基础的功能模块了,其应用也非常 ...

  2. 从一道高大上的面试题来学习位图算法BitMap

    今天我偶然刷到了一篇文章,"华为二面:一个文件里面有5亿个数据,一行一个,没有重复的,进行排序".不知道又是哪个无良媒体瞎起的标题,夺人眼球. 不过说归说,这题听着就很高大上,5亿 ...

  3. jmeter+ant+jenkins框架搭建问题

    工具介绍:   jmeter 接口编写,调试,执行.   ant Ant是Java的生成工具,都是用来编译.生成:Ant的主要目的就是把你想做的事情自动化,不用你手动一步一步做,因为里面内置了java ...

  4. 【VBA】单元格插入图片,单元格删除图片

    封装函数: Sub 插入产品形象(strRange As String, datebaseTu As String) Dim strJpg As String strJpg = datebaseTu ...

  5. nacos 集群搭建

    nacos 集群搭建 1.单机部署 从nacos官网下载zip/tar包,https://github.com/alibaba/nacos/releases/tag/2.0.2 解压后即可启动 外置数 ...

  6. 【题解】localmaxima 数论

    # T749 localmaxima 权限限制没有超链接 题目描述 Description 给出一个排列,若其中一个数比它前面的数都大,则称为localmaxima数,求一个随机排列中localmax ...

  7. 在vue项目中使用scss,以及vscode适配scss语法(解决使用scss语法编辑器报错)

    项目搭建好之后 安装sass 依赖包 npm install --save-dev sass-loader //sass-loader依赖于node-sass npm install --save-d ...

  8. sql把一个字段中的特定字符替换成其他字符

    将'0654879'替换成'0754879' UPDATE dbo.SG_Functionality SET FunctionalityCode=REPLACE(FunctionalityCode,' ...

  9. ceph-csi源码分析(6)-rbd driver-nodeserver分析(下)

    更多 ceph-csi 其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi源码分析(6)-rbd driver-nodeserver分析(下) 当c ...

  10. Linux运维网络基础

    1.网络架构的三个层次 核心层: 路由器(网关接口) 实现和外网通讯 冗余能力(主备) 汇聚层: 交换机(三层交换机) 冗余能力 策略控制能力 接入层: 交换机(二层交换机) 终端设备接入网络 2.网 ...