'''
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. GPU编程和流式多处理器(三)

    GPU编程和流式多处理器(三) 3. Floating-Point Support 快速的本机浮点硬件是GPU的存在理由,并且在许多方面,它们在浮点实现方面都等于或优于CPU.全速支持异常可以根据每条 ...

  2. httprunner的简介、httprunner做接口测试入门知识,使用httprunner模拟get请求及post请求

    一.httprunner的简介 HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试.性能测试.线上监控.持续集成等多种 ...

  3. spring——自动装配【非常详细】

    什么是自动装配? 自动装配就是让应用程序上下文为你找出依赖项的过程.说的通俗一点,就是Spring会在上下文中自动查找,并自动给bean装配与其关联的属性! spring中实现自动装配的方式有两种,一 ...

  4. MySQL基础练习

    表的一些基本操作 1.导入sql文件 source + 文件位置 2.查询某列的数据 select col1, col2, col3 from table 3.查询所有数据 select * from ...

  5. Reactor3 中文文档(用户手册)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  6. 判断Linux 系统负荷是否过载

    1.如果你的电脑很慢,可以查看下它的工作量是否太大. 在Linux系统中,我们一般使用uptime,或者w 或者top命令 如下:在操作系统中输入 :uptime 08:55:44 up 23 day ...

  7. 5.1 万 Star!不用 root 就能连接控制安卓的开源工具

    [导语]:一款在 PC 端控制安卓设备的小工具.可在 PC 和安卓设备间互通剪贴板.用电脑键盘打字.传输文件.安装程序.截图.录屏等等功能. 简介 scrcpy 可以显示并控制通过 USB (或 TC ...

  8. 5、基本数据类型(str)

    5.1.字符串: 1.n1 = "lc" n2 = 'root' n3 = """chang""" n4='''tom' ...

  9. Java Set HashSet

    import java.util.HashSet; import java.util.Set; /** Set存储特点:数据无序.不可重复 Set接口的实现类: HashSet:Set接口的主要实现类 ...

  10. iOS 针对txt文档进行解码

    如我上一篇文章记录,我加了打开其他APPtxt文件的小功能,紧接着碰到新问题了,我在测试过程中发现用户上传的TXT编码格式很多不单单是utf-8和gb2312,针对TXT文档进行解码,我一共经历过两个 ...