接上一篇,程序员在敲代码的时候觉得无聊,无聊的时候,会想到去吃零食,那么假如一个函数:

#! /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-多线程趣味(锁)的更多相关文章

  1. 第十五章、Python多线程同步锁,死锁和递归锁

    目录 第十五章.Python多线程同步锁,死锁和递归锁 1. 引子: 2.同步锁 3.死锁 引子: 4.递归锁RLock 原理: 不多说,放代码 总结: 5. 大总结 第十五章.Python多线程同步 ...

  2. python多线程中锁的概念

    1 2 3 4 5 6 7 8 mutex = threading.Lock() #锁的使用 #创建锁 mutex = threading.Lock() #锁定 mutex.acquire([time ...

  3. Python多线程-线程锁

    多线程修改一份数据时需要用到线程锁,以防止数据修改出错 #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import threa ...

  4. Python多线程互斥锁

    import threading import time num=0 def Mylock(lock): global num lock.acquire() num=num+1 time.sleep( ...

  5. Python多线程多进程那些事儿看这篇就够了~~

    自己以前也写过多线程,发现都是零零碎碎,这篇写写详细点,填一下GIL和Python多线程多进程的坑~ 总结下GIL的坑和python多线程多进程分别应用场景(IO密集.计算密集)以及具体实现的代码模块 ...

  6. Python多线程和Python的锁

    Python多线程 Python中实现多线程有两种方式,一种基于_thread模块(在Python2.x版本中为thread模块,没有下划线)的start_new_thread()函数,另一种基于th ...

  7. python多线程threading.Lock锁用法实例

    本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...

  8. Python多线程锁

    [Python之旅]第六篇(四):Python多线程锁   python lock 多线程 多线程使用方法 多线程锁 摘要:   在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来 ...

  9. python GIL 全局锁,多核cpu下的多线程性能究竟如何?

    python GIL 全局锁,多核cpu下的多线程性能究竟如何?GIL全称Global Interpreter Lock GIL是什么? 首先需要明确的一点是GIL并不是Python的特性,它是在实现 ...

  10. python 多线程中的同步锁 Lock Rlock Semaphore Event Conditio

    摘要:在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lo ...

随机推荐

  1. 配置LANMP环境(10)-- 安装memcached与redis

    一.安装memcached 1.安装 yum install memcached 2.设置1G内存 memcached -u memcached -p -m -c -d 3.启动与设置开机自启动 sy ...

  2. centos 7 安装 mail

    yum install -y sendmail 将下面内容粘贴到/etc/mail.rc中 set ssl-verify=ignore set nss-config-dir=/root/.certs ...

  3. 调整虚拟机中Linux的分辨率

    1 在虚拟机配置中,将显示的缓存提高,CPU也提高. 2 运行Linux,在system-preferences-display中调整分辨率

  4. 使用MYCAT轻松实现MYSQL水平分片

    完整文章下载地址:http://download.csdn.net/detail/dreamcode/9383516 简单来说,我们能够将数据的水平切分理解为是依照数据行的切分.就是将表中的某些行切分 ...

  5. spring mvc 伪静态处理

    spring mvc 伪静态处理 @RequestMapping(value = JsonUrlCommand.webshare_get_opuss+"/u{u:[\\w\\W]+}p{p: ...

  6. FineUIPro中如何支持多语言(全局资源文件和本地资源文件)

    一个客户在邮件中问到了FineUIPro的多语言实现问题,其实 FineUIPro 并没有对此做特殊处理,因此直接使用 ASP.NET 原生支持的资源文件就能实现. 下面我们就以FineUIPro的空 ...

  7. Hibernate Criteria 查询使用

    转载 http://blog.csdn.net/woshisap/article/details/6747466 Hibernate 设计了 CriteriaSpecification 作为 Crit ...

  8. JAVA面试题——JAVA编程题1(2015.07.22)

    实现代码很简单:   package com.xiaozan.shopping;   import java.util.Arrays;   public class ShoppingCart {    ...

  9. 京东android面试题(2018 顶级互联网公司面试题系列)

    以下来自于北京的一个兄弟的面试题 1.静态内部类和非静态内部类有什么区别  2.谈谈你对java多态的理解  3.如何开启线程,run和runnable有什么区别  4.线程池的好处  5.说一下你知 ...

  10. DDD开源框架

    DDD开源框架: ABP ENODE https://github.com/VirtoCommerce/vc-community APWorks https://github.com/daxnet/B ...