python3线程介绍02(线程锁的介绍:互斥、信号、条件、时间、定时器)
#!/usr/bin/env python
# -*- coding:utf-8 -*- import threading
import time
import random # 1-互斥锁 Lock 同一时刻只能有1个线程运行,需要将锁传给任务函数
number = 0
lock = threading.Lock() def plus(lk):
global number #开始加锁
lk.acquire() for _ in range(1000000):
number += 1
print("子线程%s运算结束后,number = %s" % (threading.current_thread().getName(), number)) # 释放锁,让别的线程也可以访问number
lk.release() if __name__ == '__main__':
for i in range(2): # 需要把锁当做参数传递给plus函数
t = threading.Thread(target=plus, args=(lock,))
t.start() # 等待2秒,确保2个子线程都已经结束运算。
time.sleep(2) print("主线程执行完毕后,number = ", number) # 2-信号锁 Semaphore 允许一定数量的线程同时更改数据
def mythread(num,se):
se.acquire()
print("run the thread %s"%num) time.sleep(1) se.release() #允许2个线程同时允许
semaphore=threading.BoundedSemaphore(2) #启动6个线程
for i in range(6):
t=threading.Thread(target=mythread,args=(i,semaphore))
t.start() # 3-条件锁 codintion 多个线程运行时,当一个线程执行后,在满足一定条件下,暂停执行当前线程,执行另一线程
num=0
con=threading.Condition() class mythread(threading.Thread):
def __init__(self,name,action):
super(mythread,self).__init__()
self.name=name
self.action=action def run(self):
global num
con.acquire() print("开始执行%s"%self.name)
while True:
if self.action=="add":
num+=1
elif self.action=="reduce":
num-=1
else:
exit(1)
print("当前num为:",num) time.sleep(1) if num==5 or num==0:
print("%s暂停执行"%self.name)
con.notify()
con.wait()
print("%s开始执行"%self.name)
con.release() if __name__=="__main__":
t1=mythread("线程1","add")
t2=mythread("线程2","reduce")
t1.start()
t2.start() # 4-事件锁 全局定义一个flag 当flag=False,线程调用wait(),被阻塞,不执行,当flag=True,线程不在阻塞
# set()->flag=True clear()->flag=False wait()->等待红绿灯信号 is_set()->是否放行状态
t=threading.Event() def lighter():
# 绿灯时间
gree_time=5 # 红灯时间
red_time=5 # 初始为红灯
t.set() while True:
print("\33[32;0m 绿灯亮...\033[0m")
time.sleep(gree_time)
t.clear() print("\33[32;0m 红灯亮...\033[0m")
time.sleep(red_time)
t.set() def runcar(name):
while True:
if t.is_set():
print("一辆[%s] 呼啸开过..." % name)
time.sleep(1)
else:
print("一辆[%s]开来,看到红灯,无奈的停下了..." % name)
t.wait()
print("[%s] 看到绿灯亮了,瞬间飞起....." % name) if __name__=="__main__":
light=threading.Thread(target=lighter,)
light.start() for name in ['奔驰', '宝马', '奥迪']:
car=threading.Thread(target=runcar,args=(name,))
car.start() #5-定时器Timer 在指定时间过后执行某个函数
def getNum():
rand=random.random()
print(rand) t=threading.Timer(4,getNum)
t.start()
python3线程介绍02(线程锁的介绍:互斥、信号、条件、时间、定时器)的更多相关文章
- Java多线程系列 JUC线程池02 线程池原理解析(一)
转载 http://www.cnblogs.com/skywang12345/p/3509960.html ; http://www.cnblogs.com/skywang12345/p/35099 ...
- 【C#】C#线程_混合线程的同步构造
目录结构: contents structure [+] 一个简单的混合锁 FCL中的混合锁 ManualResetEventSlim类和SemaphoreSlim类 Monitor类和同步块 Rea ...
- Python3学习之路~9.2 操作系统发展史介绍、进程与线程区别、线程语法、join、守护线程
一 操作系统发展史介绍 参考链接:http://www.cnblogs.com/alex3714/articles/5230609.html 二 进程与线程 进程: 对各种资源管理的集合 就可以称为进 ...
- iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信
一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码 ...
- Java基础篇——线程、并发编程知识点全面介绍(面试、学习的必备索引)
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10739579.html,希望大家多多支持!!! 一.线程基础 1.线程与进程 线程是指进程 ...
- Java并发包中线程池的种类和特点介绍
Java并发包提供了包括原子量.并发集合.同步器.可重入锁.线程池等强大工具这里学习一下线程池的种类和特性介绍. 如果每项任务都分配一个线程,当任务特别多的时候,可能会超出系统承载能力.而且线程的创建 ...
- Python3 进程 线程 同步锁 线程死锁和递归锁
进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...
- C#通过接口与线程通信(捕获线程状态)介绍
C#通过接口与线程通信(捕获线程状态)介绍 摘要:本文介绍C#通过接口与线程通信(捕获线程状态),并提供简单的示例代码供参考. 提示:本文所提到的线程状态变化,并不是指线程启动.暂停.停止,而是说线程 ...
- concurrent.futures模块简单介绍(线程池,进程池)
一.基类Executor Executor类是ThreadPoolExecutor 和ProcessPoolExecutor 的基类.它为我们提供了如下方法: submit(fn, *args, ** ...
- 内存池、进程池、线程池介绍及线程池C++实现
本文转载于:https://blog.csdn.net/ywcpig/article/details/52557080 内存池 平常我们使用new.malloc在堆区申请一块内存,但由于每次申请的内存 ...
随机推荐
- 如何使用java代码进行视频格式的转换(FLV)
如何使用java代码进行视频格式的转换(FLV) 一,前言 在给网页添加视频播放功能后,发现上传的视频有各种格式,那么就需要将他么转换成FLV,以很好的支持在线视频播放. 公司一直在使用中,配合使用, ...
- 事务背书 ACID, CAP, BASE
A atomicity 原子性 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成, C consistency 一致性 在事务开始之前和事务结束以后,数据库的完整性没有被破 ...
- java课内容2019.3.1
java的相关了解博客:答疑 https://www.cnblogs.com/aishangJava/p/6862917.html 一.构造方法: 1.构造方法只能被编译器调用一次,并且是在创建对象时 ...
- my29_PXC集群状态查看
节点从集群中移除的状态 show status like '%wsrep%';wsrep_cluster_status为Disconnected则表示该节点已经不在集群中了,示例如下 > sho ...
- 用navigator.geolocation.getCurrentPosition在IOS10以上的系统无法定位
昨天老板告诉我代码有Bug(定位失败),于是各种测试最终发现IOS10以上版本手机不能成功(穷,买不起iphone,测试不完全),先贴失败代码: var city =""; nav ...
- Hibernate通过自编写Sql修改
@Override public void updateTemMsg(String ticket,String time) { String sql="UPDATE INTER_TEMPTO ...
- Xshell设置主机名高亮
修改后的效果: 操作步骤: 情况①:如果是Ubuntu或者Debian,按照下面的流程,两步解决: 打开~/.bashrc. 修改参数force_color_prompt=yes去掉前面的注释#. 情 ...
- git知识点总结
集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器.集中式版本控制系统最大的 ...
- SourceInsight,Understand,SecureCRT设置
SourceInsight 设置字体 Option/Document Option/Screen Fonts Understand https://scitools.com/download/ ...
- eclipse把局部变量提为全局变量的快捷键是什么
没有缺省定义的直接快捷键,或者就按Ctrl+1按照melord说的那样做,或者自己在Preference/General/Keys自己对Convert Local Variable to Feild进 ...