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 ...
随机推荐
- android greendao3.0 多表关联关系讲解(转)
转自:http://www.jianshu.com/p/dbec25bd575f 前言 之前用过数据库框架:realm.kjdb,今天准备实践学习一下greendao 3.0.greendao 3.0 ...
- 嵌入式数据库H2的安装与配置
一.配置JAVA环境 1.首先检查系统是否自带JDK 使用命令:#java -version 没有信息即为没有安装,如有且版本较低,可采用如下方式卸载: 查看命令: rpm -qa | grep ja ...
- 表转List泛型数组
转换那块怕忘记,留存一下 using System; using System.Collections.Generic; using System.Data; using System.Linq; u ...
- Channel (Java NIO)
[正文]netty源码死磕1.3: Java NIO Channel 1. Java NIO Channel 1.1. Java NIO Channel的特点 和老的OIO相比,通道和NIO流(非阻 ...
- Delphi 64与32位的差异
Delphi 64与32位的差异 最近,Delphi推出了64位预览版本, 我做为一个忠实的Delphier, 看到这消息后,第一时间学习,并写下这个做为以后的参考资料. 相同点: 在Delphi ...
- Docker学习总结之docker创建私有仓库(private Repositories)
Docker 创建 Private Repositories 前言 基于GFW的缘故,国内大陆基本无法pull国外的镜像,更别说官方的index了.如果images无法pull下来,那么docker就 ...
- SM30 表格维护生成器
1)SE11创建自建表,结构如下: 2) 创建表维护 3) 针对上面创建的函数组ZMM_MAT_DESC,做以下增强处理 添加的Module 代码如下: module mod_customize in ...
- ERROR 2003 (HY000): Can't connect to MySQL server on 'ip地址' (110)
用windows能远程连接数据库服务器,用ubuntu就报错,怎么都连不上,报这个错ERROR 2003 (HY000): Can't connect to MySQL server on 'ip地址 ...
- LeetCode:寻找重复数【287】
LeetCode:寻找重复数[287] 题目描述 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数 ...
- shiro2
mapper接口:根据用户id查询用户权限的菜单 service接口:根据用户id查询用户权限的菜单 获取用户权限范围的url 思路: 在用户认证时,认证通过,根据用户id从数据库获取用户权限范围的u ...