python-多线程趣味(锁)
接上一篇,程序员在敲代码的时候觉得无聊,无聊的时候,会想到去吃零食,那么假如一个函数:
#! /usr/bin/env python
#coding=utf-8 '''
'''
import time
import threading class MyThread(threading.Thread):
def __init__(self,func,args,name=''):
threading.Thread.__init__(self)
self.name = name
self.func = func
self.args = args def run(self):
#某某线程要开始了
print(self.name + "开始了#######") if self.name == "听歌线程":
matter1(music)
elif self.name == "打码线程":
matter2(number)
elif self.name == "零食线程":
matter3(snacks)
print(self.name + "结束了########") def matter1(music):
for i in range(0,len(music)):
print("第" + str(i+1) + "首歌是:" + str(music[i]))
#假设每一首歌曲的时间是2s
time.sleep(2)
print("切换下一首歌...") def matter2(number):
j = 1
while j <= number:
print("我准备写入第" + str(j) + "行代码")
j = j+1
#假设每一行代码的时间为1s
time.sleep(1)
print("写下一行代码...") def matter3(snacks):
for i in range(0,len(snacks)):
print("我正在听着歌吃" + str(snacks[i]) + "零食")
#假设没吃一袋零食间隔为5s
time.sleep(5)
print("吃完一包零食") if __name__ == '__main__':
#设定我要听的歌曲为
music = ['music1','music2','music3'] #设定我要打码的行数
number = 4 #设定我要吃的零食为
snacks = ["辣条","可乐"] #开始时间
start = time.time() thing1 = MyThread(matter1,music,"听歌线程")
thing2 = MyThread(matter2,number,"打码线程")
thing3 = MyThread(matter3,snacks,"零食线程") thing1.start()
thing2.start()
thing3.start() thing1.join()
thing2.join()
thing3.join() #结束时间
end = time.time()
print("完成的时间为:",str(end - start))
结果:
完成的时间为: 10.001572132110596
但是但是,程序员只有两只手,那么吃零食和敲代码是不能同时进行了,需要加一个线程锁:
#! /usr/bin/env python
#coding=utf-8 '''
吃零食比较耗时间,但是程序猿有两只手,那么吃零食和打代码不能同时进行,
那么这里加个线程锁 线程同步就是为了防止这个,同时也引入了锁的概念.Lock和Rlock可以实现线程同步.这两个对象都有
acquire方法和release方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到acquire和release方法之间.
你可以理解为这两个方法之间的东西会被锁定. '''
import time
import threading #打开线程锁
lock = threading.Lock() class MyThread(threading.Thread):
def __init__(self,target,args,name=''):
threading.Thread.__init__(self)
self.name = name
#self.func = func
self.target = target
self.args = args def run(self):
#某某线程要开始了
print(self.name + "开始了#######") if self.name == "听歌线程":
matter1(music)
elif self.name == "打码线程":
matter2(number)
elif self.name == "零食线程":
matter3(snacks)
print(self.name + "结束了########") def matter1(music):
for i in range(0,len(music)):
print("第" + str(i+1) + "首歌是:" + str(music[i]))
#假设每一首歌曲的时间是2s
time.sleep(2)
print("切换下一首歌...") def matter2(number):
#获取锁,成功获得锁定后返回True,可选的timeout参数不填时将一直阻塞直到获得锁定
lock.acquire()
j = 1
while j <= number:
print("我准备写入第" + str(j) + "行代码")
j = j+1
#假设每一行代码的时间为1s
time.sleep(1)
print("写下一行代码...")
##释放锁,开始下一个线程
lock.release() def matter3(snacks):
lock.acquire()
for i in range(0,len(snacks)):
print("我正在听着歌吃" + str(snacks[i]) + "零食")
#假设没吃一袋零食间隔为5s
time.sleep(5)
print("吃完一包零食")
lock.release() if __name__ == '__main__':
#设定我要听的歌曲为
music = ['music1','music2','music3'] #设定我要打码的行数
number =4 #设定我要吃的零食为
snacks = ["辣条","可乐"] #开始时间
start = time.time() thing1 = MyThread(matter1,music,"听歌线程")
thing2 = MyThread(matter2,number,"打码线程")
thing3 = MyThread(matter3,snacks,"零食线程") thing1.start()
thing2.start()
thing3.start() thing1.join()
thing2.join()
thing3.join() #结束时间
end = time.time()
print("完成的时间为:",str(end - start))
完成时间:
完成的时间为: 14.000801086425781
结果:
听歌线程开始了#######
第1首歌是:music1
打码线程开始了#######
我准备写入第1行代码
零食线程开始了#######
写下一行代码...
我准备写入第2行代码
切换下一首歌...
第2首歌是:music2
写下一行代码...
我准备写入第3行代码
写下一行代码...
我准备写入第4行代码
切换下一首歌...
第3首歌是:music3
写下一行代码...
打码线程结束了########
我正在听着歌吃辣条零食
切换下一首歌...
听歌线程结束了########
吃完一包零食
我正在听着歌吃可乐零食
吃完一包零食
零食线程结束了########
完成的时间为: 14.000801086425781
python-多线程趣味(锁)的更多相关文章
- 第十五章、Python多线程同步锁,死锁和递归锁
目录 第十五章.Python多线程同步锁,死锁和递归锁 1. 引子: 2.同步锁 3.死锁 引子: 4.递归锁RLock 原理: 不多说,放代码 总结: 5. 大总结 第十五章.Python多线程同步 ...
- python多线程中锁的概念
1 2 3 4 5 6 7 8 mutex = threading.Lock() #锁的使用 #创建锁 mutex = threading.Lock() #锁定 mutex.acquire([time ...
- Python多线程-线程锁
多线程修改一份数据时需要用到线程锁,以防止数据修改出错 #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import threa ...
- Python多线程互斥锁
import threading import time num=0 def Mylock(lock): global num lock.acquire() num=num+1 time.sleep( ...
- Python多线程多进程那些事儿看这篇就够了~~
自己以前也写过多线程,发现都是零零碎碎,这篇写写详细点,填一下GIL和Python多线程多进程的坑~ 总结下GIL的坑和python多线程多进程分别应用场景(IO密集.计算密集)以及具体实现的代码模块 ...
- Python多线程和Python的锁
Python多线程 Python中实现多线程有两种方式,一种基于_thread模块(在Python2.x版本中为thread模块,没有下划线)的start_new_thread()函数,另一种基于th ...
- python多线程threading.Lock锁用法实例
本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...
- Python多线程锁
[Python之旅]第六篇(四):Python多线程锁 python lock 多线程 多线程使用方法 多线程锁 摘要: 在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来 ...
- python GIL 全局锁,多核cpu下的多线程性能究竟如何?
python GIL 全局锁,多核cpu下的多线程性能究竟如何?GIL全称Global Interpreter Lock GIL是什么? 首先需要明确的一点是GIL并不是Python的特性,它是在实现 ...
- python 多线程中的同步锁 Lock Rlock Semaphore Event Conditio
摘要:在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lo ...
随机推荐
- (1) yum源配置-epel
1.获取epel地址 登录https://fedoraproject.org/wiki/EPEL/zh-cn,看“如何获取EPEL的软件包”,根据你的操作系统版本,复制对应的下载地址. 2.下载epe ...
- xfs 文件系统损坏修复 fscheck
- ELK之jason配置nginx文件等多个配置文件
[root@web02 ~]# cat /etc/logstash/conf.d/nginx.conf input { file { path => "/var/log/nginx/a ...
- (C#)为应用程式设定运行权限(System.Security类下的GenericIdentity,GenericPrincipal,PrincipalPermission)
最近看书<编写高质量代码改善C#程序的157个建议>,知识点备忘: System.Security.Principal.GenericIdentity==>表示一般用户 System ...
- Hugo hexo 搭建博客系列1:自己的服务器
hexo jekyll https://hexo.io/zh-cn/ http://theme-next.iissnan.com/getting-started.html Hexo 是高效的静态站点生 ...
- 基于markdown的blog系统调研1:typecho
))
- 转载 iOS全局检测网络变化的实时状态
昨天浏览了cocoaChina,发现了一遍文章是优化Reachablity框架的出来的检测网络类,大家都知道这个Reachablity框架是用来检测网络变化的!但是也是有一点bug,事实上,基于此 ...
- "活在未来" VS “活在当下”(通向财富自由学习笔记六)
之前读过一些灵修类的书籍,<遇见未知的自己>.<当下的力量>等都在告诉我们活在当下很重要,这里笑来老师提出了一个问题,是活在当下重要呢?还是活在未来?,笑来老师给出了很好的答案 ...
- Cadence 15.7 win7无法启动解决方法
原帖地址:http://blog.sina.com.cn/s/blog_69a5dce90100kscf.html 按照XP下的破解方法安装Cadence15.7后, 如果不能正常启动Cadence ...
- Aeroplane chess(简单概率dp)
Hzz loves aeroplane chess very much. The chess map contains N+1 grids labeled from 0 to N. Hzz start ...